Berikut arsitektur aplikasi dengan menggunakan konsep microservice:
- Jika user belum login, maka browser jika mengakses resource atau service
registrationharuslah meminta request token keauth server. - Setelah di check username dan password valid maka
auth serverakan mengembalikan sebuah token yang dikonversi ke format JWT (JSON Web Token) yang kemudian di kirimkan kebrowser. - Setelah mendapatkan
access_tokenmakanbrowserakan mengirimkan request ke serviceregistration, kemudian service melakukan operasi kedatabasedengan mengembalikan data json seperti berikut contohnya:
{
"id": 1,
"projectName": "mandiri-mits",
"projectOwenerId" : 1
}Dari json tersebut terdapat property projectOwenerId, property tersebut merupakan primary key dari table user tetapi objectnya tidak ada di module registration karena mungkin secara database memang satu database tapi secara entity tidak contoh implementasinya seperti berikut:
// module registration
public class Registration{
private Integer id;
private String projectName;
private Integer projectOwnerId;
// setter & getter
}
public class User{
private Integer id;
private String email;
// setter & getter
}// module resource management
public class User{
private Integer id;
private String email;
private String password;
private List<Role> roles;
// setter & getter
}- Setelah mendapatkan data dari
databasetahap selanjutnya adalah mendapatkan object user berdasarkan propertyprojectOwnerIddengan melewati protokol http bukan lewat database. kalau lewat database itu sama aja seperti aplikasi monolint (aplikasi web pada umumnya). - Dengan menggunakan konsep ini jadi kita bisa meminimalisir duplikasi karena aplikasi udah di buat secara modular dan dengan tujuan yang jelas tidak campur-aduk jadi satu. Untuk menakses service lain kita bisa menggunakan framework HttpClient yang terkenal di Spring yaitu
RestTemplateseperti berikut contohnya:
@GetMapping("/")
public ResponseEntity responseBack(){
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", token);
HttpEntity<User> httpEntity = new HttpEntity<>(headers);
String uri = new StringBuilder("http://localhost:8080").append("/api/users/me").toString();
return restTemplate.exchange(
uri, HttpMethod.GET, httpEntity, User.class
);
}- Setelah itu maka hasilnya seperti berikut:
{
"id": 1,
"projectName": "mandiri-mits",
"projectOwner" : {
"id" : 1,
"email": "[email protected]"
}
}- JDK 1.8
- maven
- MySQL database server 5.7
- docker (optional)
- setup MySQL database
- on docker :
docker-compose up - manualy :
- mysql version 5.7
- user: root
- password: root
- database registration
- port: 3301
- mysql version 5.7
- user: root
- password: root
- database: usermanagement
- port: 3302
- mysql version 5.7
- on docker :
- install dependecy:
mvn clean installauthserver-oauth2moduleservice-resource-managementmoduleservice-registrationmodule
- run as spring-boot:
mvn clean spring-boot:runauthserver-oauth2moduleservice-resource-managementmoduleservice-registrationmodule
- login / minta token
curl -X POST -vu example_client:example_password http://localhost:10000/login/oauth/token -H "Accept: application/json" -d "client_id=example_client&grant_type=password&[email protected]&password=password"
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 10000 (#0)
* Server auth using Basic with user 'example_client'
> POST /login/oauth/token HTTP/1.1
> Host: localhost:10000
> Authorization: Basic ZXhhbXBsZV9jbGllbnQ6ZXhhbXBsZV9wYXNzd29yZA==
> User-Agent: curl/7.54.0
> Accept: application/json
> Content-Length: 93
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 93 out of 93 bytes
< HTTP/1.1 200
< Cache-Control: no-store
< Pragma: no-cache
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: DENY
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Sun, 03 Jun 2018 23:37:07 GMT
<
* Connection #0 to host localhost left intact
{"access_token":"57da7983-41fb-4be2-8fc9-8b86ba7d5463","token_type":"bearer","refresh_token":"1f41dea5-6e7c-49db-b357-b3b226f80a2a","expires_in":43199,"scope":"read write trust"}➜ springboot-microservice-example git:(master) ✗- Request ke
registration servicedengan mengirimkan ke data sebagai berikut besertaaccess_tokenyang didapatkan dari request token sebelumnya:
curl -H "Authorization: Bearer 57da7983-41fb-4be2-8fc9-8b86ba7d5463" http://localhost:11000/registration/api/registration/general
{
"id":1,
"user":{
"id":1,
"email":"dimmaryanto@gmail",
"password":"password"
},
"createdDate":"2018-10-10"
}
