Skip to content

Belajar Microservice dengan SpringBoot

Notifications You must be signed in to change notification settings

dimMaryanto93/springboot-microservice-example

Repository files navigation

Belajar microservice dengan SpringBoot

Berikut arsitektur aplikasi dengan menggunakan konsep microservice:

konsep microservice

konsep database

Flow microservice

  1. Jika user belum login, maka browser jika mengakses resource atau service registration haruslah meminta request token ke auth server.
  2. 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 ke browser.
  3. Setelah mendapatkan access_token makan browser akan mengirimkan request ke service registration, kemudian service melakukan operasi ke database 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
}
  1. Setelah mendapatkan data dari database tahap selanjutnya adalah mendapatkan object user berdasarkan property projectOwnerId dengan melewati protokol http bukan lewat database. kalau lewat database itu sama aja seperti aplikasi monolint (aplikasi web pada umumnya).
  2. 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
    );
}
  1. Setelah itu maka hasilnya seperti berikut:
{
    "id": 1,
    "projectName": "mandiri-mits",
    "projectOwner" : {
        "id" : 1,
        "email": "dimmaryanto@gmail.com"
    }
}

System Requirement

  • JDK 1.8
  • maven
  • MySQL database server 5.7
  • docker (optional)

Run application

  • 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
  • install dependecy: mvn clean install
    • authserver-oauth2 module
    • service-resource-management module
    • service-registration module
  • run as spring-boot: mvn clean spring-boot:run
    • authserver-oauth2 module
    • service-resource-management module
    • service-registration module

Test example

  1. 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) ✗
  1. Request ke registration service dengan mengirimkan ke data sebagai berikut beserta access_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"
}

About

Belajar Microservice dengan SpringBoot

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages