Berikut arsitektur aplikasi dengan menggunakan konsep microservice:
- Jika user belum login, maka browser jika mengakses resource atau service
registration
haruslah meminta request token keauth server
. - Setelah di check username dan password valid maka
auth server
akan mengembalikan sebuah token yang dikonversi ke format JWT (JSON Web Token) yang kemudian di kirimkan kebrowser
. - Setelah mendapatkan
access_token
makanbrowser
akan mengirimkan request ke serviceregistration
, kemudian service melakukan operasi kedatabase
dengan 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
database
tahap selanjutnya adalah mendapatkan object user berdasarkan propertyprojectOwnerId
dengan 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
RestTemplate
seperti 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": "dimmaryanto@gmail.com"
}
}
- 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 install
authserver-oauth2
moduleservice-resource-management
moduleservice-registration
module
- run as spring-boot:
mvn clean spring-boot:run
authserver-oauth2
moduleservice-resource-management
moduleservice-registration
module
- 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&username=dimmaryanto@gmail.com&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 service
dengan mengirimkan ke data sebagai berikut besertaaccess_token
yang 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"
}