Flazzo memiliki fokus utama untuk menambah nilai bisnis Anda.

Blog

Spring Cloud: Cara Menerapkan Penemuan Layanan (Bagian 2)

16998199-thumb.jpg
Blog

Spring Cloud: Cara Menerapkan Penemuan Layanan (Bagian 2)


Pada bagian sebelumnya dari artikel ini, Spring Cloud: How to Implement Service Discovery (Bagian 1), kita melihat dasar-dasar Service Discovery dalam konteks Spring Cloud. Kami telah melihat bahwa komponen Netflix OSS Eureka tetap menjadi pilihan utama. Pada artikel ini, kita akan membahas beberapa topik tambahan Eureka, seperti:

Penemuan Layanan: Klien Java API

Pada contoh di bagian pertama artikel ini, fungsi perekaman dan pengambilan berjalan di bawah tenda dan kami hanya melihat hasil pengujian seluruh arsitektur dengan memanggil klien REST titik akhir. Ada juga cara untuk berinteraksi dengan Eureka API secara terprogram, menggunakan pemanggilan metode Java. Pilihan yang mungkin adalah menggunakan the EurekaClient kelas. Misalnya, jika kita ingin mendapatkan semua instance layanan yang diidentifikasi oleh id tertentu, kita dapat menulis kode berikut, dengan asumsi kita memiliki klien yang diimplementasikan sebagai aplikasi Spring Boot yang menampilkan layanan REST:

  	@Autowired
	private EurekaClient eurekaClient;
		
	@GetMapping("/testEurekaClient")
	public String testEurekaClient() {
		Application application = eurekaClient.getApplication("CLIENT-SERVICE");
		List<InstanceInfo> instanceInfos = application.getInstances();
	    if (instanceInfos != null && instanceInfos.size() > 0 ) {
	        return instanceInfos.get(0).getHomePageUrl();
	    }
	    return null;
	}

Spring Cloud menawarkan alternatif di atas dengan caranya sendiri DiscoveryClient kelas. Jadi kita juga bisa mengimplementasikan kode di atas dengan yang berikut:

	@Autowired
	private DiscoveryClient discoveryClient;
			         	
	@GetMapping("/testDiscoveryClient")
	public String testDiscoveryClient() {
	    List<ServiceInstance> serviceInstances = discoveryClient.getInstances("CLIENT-SERVICE");
	    if (serviceInstances != null && serviceInstances.size() > 0 ) {
	        return serviceInstances.get(0).getServiceId();
	    }
	    return null;
	}

Penemuan Layanan: Eureka REST API

Kami melihat di bagian sebelumnya bagaimana menggunakan Java API untuk berinteraksi dengan server penemuan Eureka. Dalam skenario yang lebih umum, kita mungkin memiliki komponen yang tidak ditulis di Java. Dalam hal ini, kita bisa menggunakan REST API yang disediakan oleh Eureka. Beberapa parameternya dijelaskan di bawah ini:

  • /eureka/v2/apps: Dengan operasi GET, dapatkan semua instance
  • /eureka/v2/apps/appID: Jika digunakan dengan tindakan POST, ia mendaftarkan instance aplikasi, dan dengan GET, ia mengambil semua ID aplikasi.
  • /eureka/v2/apps/appID/instanceID: Jika digunakan dengan tindakan DELETE, tindakan ini akan menghapus instance tertentu dari registri server, sementara PUT mengirimkan “detak jantung” ke server untuk instance tertentu tersebut.
  • /eureka/v2/apps/appID/instanceID/metadata?key=nilai: Dengan PUT digunakan untuk memperbarui metadata

Penemuan Layanan: Mengamankan Server

Menetapkan tingkat keamanan minimum penting untuk instans penemuan di lingkungan produksi. Kami dapat melindungi server penemuan, misalnya, dengan fase otentikasi sederhana berdasarkan nama pengguna dan kata sandi. Untuk melakukan ini, kita perlu menetapkan nama pengguna dan kata sandi di file application.yml oleh Spring.keamanan.pengguna properti:

spring:
   security:
      user:
         name: myusername
         password: mypassword   

Selanjutnya, agar dapat mengotentikasi dan berkomunikasi dengan server penemuan layanan, kita perlu mengatur sesuatu seperti berikut pada konfigurasi sisi klien, dengan asumsi port server adalah 8760 dan berjalan secara lokal dengan klien :

eureka:
   client:
      serviceUrl:
         defaultZone:  

Penemuan Layanan: Mengamankan Klien

Sisi klien dalam diskusi ini adalah komponen layanan dari sistem layanan mikro kami. Mengamankan mereka berarti mengamankan saluran komunikasi untuk setiap komponen. Jika klien mengekspos fungsionalitasnya melalui layanan REST, saluran komunikasi bergantung pada protokol HTTP. Kami dapat mengamankannya dengan menerapkan komunikasi SSL.

Untuk mengaktifkan SSL sisi klien, pertama-tama kita memerlukan sertifikat. Kami dapat membuat sertifikat yang ditandatangani sendiri menggunakan keytool program Java, seperti ini:

keytool -genkey -alias client -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 365

Kemudian kita dapat mengambil yang dihasilkan keystore.p12 file dan salin ke /sumber daya folder aplikasi Spring Boot kami dan atur konfigurasi berikut di aplikasi.yml untuk mengajukan:

server:
   ssl:
      key-store: classpath:keystore.p12
      key-store-password: mypassword
      keyStoreType: PKCS12
      keyAlias: client

Dengan cara di atas, kami dapat memanggil layanan kami menggunakan HTTPS di bagian protokol URL. Kami dapat meningkatkan konfigurasi dengan mengaktifkan HTTPS dan bukan HTTP, dengan menyetel properti instans Eureka berikut:

eureka: 
   instance: 
      securePortEnabled: true 
      nonSecurePortEnabled: false 
      statusPageUrl:  
      healthCheckUrl: 
      homePageUrl: 

Di sini kami juga telah menetapkan beberapa parameter, seperti informasi, kesehatan, dan URL beranda.

Penemuan Layanan: Gabungkan dengan Konfigurasi Jarak Jauh

Kami dapat menggabungkan penemuan layanan dengan konfigurasi terdistribusi dalam dua cara berbeda:

  • Pendekatan pengaturan pertama
  • Penemuan pendekatan pertama

Kami akan menjelaskan kedua pendekatan ini di bagian berikut.

Konfigurasikan terlebih dahulu

Dalam pendekatan Config First, server konfigurasi jarak jauh adalah titik pusat arsitektur. Instance layanan dan penemuan klien akan terhubung ke server konfigurasi untuk mengambil konfigurasinya.

Untuk mengatur server konfigurasi, kita perlu menambahkan dependensi ini ke file Maven POM:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>

Dalam aplikasi.yml file, untuk menyederhanakan contoh, kami akan mendefinisikan file spring.profiles.aktif properti seperti native. Dengan cara ini kita bisa menggunakan repositori lokal, berdasarkan file konfigurasi yang disimpan di classpath, dan kita bisa memilih untuk meletakkannya di / konfigurasi subfolder dari /sumber daya boot musim semi direktori aplikasi. Kami juga mengamankan server dengan autentikasi dasar melalui pengguna.keamanan Properti.

spring:
  profiles:
     active: native
  application:
    name: config-server
  security:
    user:
      name: myusername
      password: mypassword

Dalam aplikasi.yml berkas dari pelanggan Dan layanan penemuan aplikasi, kami hanya akan menyimpan properti dasar; misalnya, yang diperlukan untuk terhubung ke server konfigurasi. Properti lainnya akan disimpan di server konfigurasi itu sendiri, dalam file tertentu yang disimpan di / konfigurasi folder yang disebutkan di atas.

Konfigurasi basis pelanggan

Untuk konfigurasi layanan klien dasar, kita perlu menambahkan konfigurasi jarak jauh dan dependensi klien penemuan Eureka:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>   
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

Dan di aplikasi.yml file, kita akan mendefinisikan config.import parameter dengan optional:configserver nilai, untuk terhubung ke server konfigurasi (tidak perlu menentukan URL, karena ini adalah nilai default untuk server konfigurasi):

spring:  
  application:
    name: client-service
  config:
    import: "optional:configserver:"
  cloud:
    config:
      username: myusername
      password: mypassword

Konfigurasi Server Penemuan Dasar

Discovery server juga membutuhkan spring-cloud-starter-config kecanduan:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

Dan aplikasi.yml konten akan serupa dengan yang diperlukan untuk klien:

spring:  
  application:
    name: discovery-service
  security:
     user:
        name: myusername
        password: mypassword
  config:
    import: "optional:configserver:"
  cloud:
    config:
      username: myusername
      password: mypassword

Konfigurasi khusus untuk layanan klien dan penemuan

Setelah mendefinisikan konfigurasi dasar klien dan komponen penemuan seperti di atas, kita perlu mendefinisikan lebih spesifik di dalam server konfigurasi. Kami akan menggunakan dua file konfigurasi yang disimpan di /sumber daya/config Folder aplikasi Spring Boot disebutkan sebelumnya. File diberi nama setelah Nama aplikasi properti dari setiap aplikasi:

  • /config/client-service.yml
  • /config/discovery-service.yml

Isi dari layanan-klien.yml akan:

server:
   port: ${PORT:8080}

myproperty: value

eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
       defaultZone: 

Seperti yang bisa kita lihat di atas, the defaultZone Properti berisi URL instance server Eureka, dengan nama pengguna dan kata sandi di dalamnya, karena kami mengamankan server penemuan dengan autentikasi dasar, sebagai server konfigurasi.

Adapun konfigurasi jarak jauh dari server penemuan, mis. discovery-service.yml file, kami akan memiliki konten berikut:

eureka:
   instance:
      hostname: localhost
   client:
      registerWithEureka: false
      fetchRegistry: false
      
server:
   port: ${PORT:8760}

Konfigurasi Pertama: Contoh Proyek dari GitHub

Anda dapat menemukan tiga proyek contoh dengan konfigurasi di atas di GitHub:

Kita dapat menguji contoh dengan mengkompilasi dan membangun ketiga proyek dengan “mvn clean install”, lalu menjalankan single jar file dari baris perintah:

java -jar spring-cloud-discovery-configserver-configfirst-1.0-SNAPSHOT.jar 
... 
java -jar spring-cloud-discovery-client-configfirst-1.0-SNAPSHOT.jar 
...
java -jar spring-cloud-discovery-server-configfirst-1.0-SNAPSHOT.jar

Kemudian kita dapat memeriksa dasbor layanan penemuan, di mana kita akan melihat instance klien tunggal terdaftar sebagai ‘CLIENT-SERVICE’, dan memverifikasi klien, misalnya, dengan menjalankan layanan REST yang diimplementasikan olehnya .

penemuan pertama

Dalam pendekatan Discovery First, layanan penemuan tidak seharusnya menyimpan konfigurasinya dari jarak jauh. Sebaliknya, server konfigurasilah yang mendaftarkan dirinya sendiri pada register penemuan. Adapun layanan klien, itu juga akan mendaftar pada layanan penemuan, untuk mengambil properti yang diperlukan untuk terhubung ke server konfigurasi. Dalam arsitektur ini, klien hanya perlu mengetahui ID aplikasi server konfigurasi dan kredensial keamanan, jika ada.

Layanan penemuan tidak lagi memerlukan ketergantungan klien server konfigurasi dan konfigurasinya dapat disimpan seluruhnya di tempatnya. aplikasi.yml untuk mengajukan:

spring:
   application:
      name: discovery-service
   security:
      user:
         name: myusername
         password: mypassword
               
eureka:
   instance:
      hostname: localhost
   client:
      registerWithEureka: false
      fetchRegistry: false
      
server:
   port: ${PORT:8760}

Klien konfigurasi lokal dan konfigurasi server dijelaskan dalam dua bagian di bawah ini.

Konfigurasi basis pelanggan

Dependensi Maven POM sama dengan skenario Config First, sedangkan konfigurasi lokal dasar di file application.yml lokal harus berisi URL layanan Eureka.

spring:
   application:
      name: client-service
      
eureka:
  client:
     serviceUrl:
        defaultZone: 

Konfigurasi dasar dari server konfigurasi

Sebagai tambahan spring-cloud-config-server dalam skenario penemuan pertama, aplikasi server konfigurasi juga memerlukan ketergantungan klien Eureka:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-config-server</artifactId>
</dependency>

Dan aplikasi.yml konten akan berisi URL layanan penemuan, seperti komponen klien:

server:  
  port: ${PORT:8888}
  
spring:
  profiles:
     active: native
  application:
     name: config-server
           
eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
      defaultZone: 

Konfigurasi khusus untuk layanan pelanggan

Dalam skenario penemuan pertama, repositori server konfigurasi lokal hanya akan berisi file konfigurasi klien:

  • /config/client-service.yml

Dan isi dari layanan-klien.yml akan:

server:
   port: ${PORT:8080}

myproperty: value

spring:
   cloud: 
      config: 
         discovery: 
            enabled: true 
            serviceId: config-server

eureka:
  client:
    serviceUrl:
       defaultZone: 

Di sini, selain URL layanan penemuan, yang diperlukan karena klien harus terhubung terlebih dahulu, kita juga dapat melihat spring.cloud.config.discovery.enabled properti diatur ke true. Properti ini menunjukkan kepada aplikasi klien bahwa ia harus terhubung ke server konfigurasi dengan metadatanya yang disimpan di registri layanan penemuan. Properti serviceId menyimpan ID aplikasi server konfigurasi yang cocok dengan yang disimpan di registri layanan penemuan.

Kita dapat menyimpulkan bahwa dalam skenario layanan penemuan, instance server konfigurasi (atau instance) dapat diubah untuk dijalankan pada host/port yang berbeda tanpa perlu mengubah konfigurasi klien.

Penemuan Pertama: Contoh Proyek dari GitHub

Di bawah ini adalah tautan GitHub dari proyek sampel untuk skenario Discovery First:

Kita dapat menguji contoh seperti yang telah kita lakukan untuk skenario konfigurasi pertama.

Kesimpulan

Pada artikel ini, kami telah menyelesaikan diskusi yang dimulai pada bagian pertama artikel dan memperkenalkan topik lain, seperti:

  • API Java terprogram
  • REST-API
  • Cara memasang lapisan keamanan dasar pada server penemuan dan aplikasi klien
  • Gabungkan fitur penemuan dan konfigurasi jarak jauh dengan dua cara berbeda: konfigurasikan terlebih dahulu Dan penemuan pertama.

Anda dapat menemukan kode sumber untuk contoh di artikel ini di GitHub berikut modul: