Spring Cloud 高可用服務(wù)治理
Eureka 客戶端
配置多Eureka 注冊(cè)中心
## 應(yīng)用名稱
spring.application.name = spring-cloud-eureka-client
## 客戶端 端口隨即可用
server.port = 0
## 配置連接 Eureka 服務(wù)器
## 配置多個(gè) Eureka 注冊(cè)中心牵舱,以"," 分割
eureka.client.serviceUrl.defaultZone = \
http://localhost:9090/eureka,\
http://localhost:9091/eureka
激活 :@EnableEurekaClient
或者 @EnableDiscoveryClient
package com.segumentfault.springcloudlesson5eurekaclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableDiscoveryClient
//@EnableEurekaClient 只能適用于eurekaClient
//@EnableDiscoveryClient基于spring-cloud-commons, @EnableEurekaClient基于spring-cloud-netflix著觉。
public class SpringCloudLesson5EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudLesson5EurekaClientApplication.class, args);
}
}
Eureka 服務(wù)器
配置高可用 Eureka 服務(wù)器
設(shè)置公用 Eureka 服務(wù)器配置
application.properties
:
## 定義 應(yīng)用名稱
spring.applicaiton.name = spring-cloud-eureka-server
## 管理端安全失效
management.security.enabled = false
## 公用 Eureka 配置
### 向注冊(cè)中心注冊(cè)
eureka.client.register-with-eureka = true
### 向獲取注冊(cè)信息(服務(wù)、實(shí)例信息)
eureka.client.fetch-registry = true
配置 Peer 1 Eureka 服務(wù)器
application-peer1.properties
:(單機(jī)情況相當(dāng)于 profile = "peer1")
# peer 1 完整配置
## 配置 服務(wù)器端口
## peer 1 端口 9090
server.port = 9090
## peer 2 主機(jī):localhost , 端口 9091
peer2.server.host = localhost
peer2.server.port = 9091
# Eureka 注冊(cè)信息
eureka.client.serviceUrl.defaultZone = http://${peer2.server.host}:${peer2.server.port}/eureka
啟動(dòng) Peer 1 Eureka 服務(wù)器
通過(guò)啟動(dòng)參數(shù) —spring.profiles.active=peer1
,相當(dāng)于讀取了 application-peer1.properties
和 application.properties
配置 Peer 2 Eureka 服務(wù)器
application-peer2.properties
:(單機(jī)情況相當(dāng)于 profile = "peer2")
# peer 2 完整配置
## 配置 服務(wù)器端口
## peer 2 端口 9091
server.port = 9091
## peer 1 主機(jī):localhost , 端口 9090
peer1.server.host = localhost
peer1.server.port = 9090
# Eureka 注冊(cè)信息
eureka.client.serviceUrl.defaultZone = http://${peer1.server.host}:${peer1.server.port}/eureka
啟動(dòng) Peer 2 Eureka 服務(wù)器
通過(guò)啟動(dòng)參數(shù) —spring.profiles.active=peer2
,相當(dāng)于讀取了 application-peer2.properties
和 application.properties
Spring Cloud Consul
引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
激活服務(wù)發(fā)現(xiàn)客戶端
package com.segumentfault.springcloudlesson5consulclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudLesson5ConsulClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudLesson5ConsulClientApplication.class, args);
}
}
利用服務(wù)發(fā)現(xiàn)API 操作
配置應(yīng)用信息
## 應(yīng)用名稱
spring.application.name = spring-cloud-consul
## 服務(wù)端口
server.port = 8080
## 管理安全失效
management.security.enabled = false
## 連接 Consul 服務(wù)器的配置
### Consul 主機(jī)地址
spring.cloud.consul.host = localhost
### Consul 服務(wù)端口
spring.cloud.consul.port = 8500
編寫(xiě) DiscoveryClient
Controller
package com.segumentfault.springcloudlesson5consulclient.web.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.LinkedList;
import java.util.List;
/**
* {@link DiscoveryClient} {@link RestController}
*
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
* @since 1.0.0
*/
@RestController
public class DiscoveryClientController {
private final DiscoveryClient discoveryClient;
private final String currentApplicationName;
@Autowired
public DiscoveryClientController(DiscoveryClient discoveryClient,
@Value("${spring.application.name}") String currentApplicationName) {
this.discoveryClient = discoveryClient;
this.currentApplicationName = currentApplicationName;
}
/**
* 獲取當(dāng)前應(yīng)用信息
*
* @return
*/
@GetMapping("/current/service-instance")
public ServiceInstance getCurrentServiceInstance() {
// return discoveryClient.getInstances(currentApplicationName).get(0);
return discoveryClient.getLocalServiceInstance();
}
/**
* 獲取所有的服務(wù)名
*
* @return
*/
@GetMapping("/list/services")
public List<String> listServices() {
return discoveryClient.getServices();
}
/**
* 獲取所有的服務(wù)實(shí)例信息
*
* @return
*/
@GetMapping("/list/service-instances")
public List<ServiceInstance> listServiceInstances() {
List<String> services = listServices();
List<ServiceInstance> serviceInstances = new LinkedList<>();
services.forEach(serviceName -> {
serviceInstances.addAll(discoveryClient.getInstances(serviceName));
});
return serviceInstances;
}
}