Eureka叢集原理說明

1,參考單機版Erueka7001,搭建Eureka7002
2,該pom檔案
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3,修改本地映射路徑
1,找到C:\Windows\System32\drivers\etc路徑下的hosts檔案
2,修改映射配置添加進hosts檔案
3,添加127.0.0.1 eureka7001.com,127.0.0.1 eureka7002.com
4,修改Eureka7001,7002YML檔案(之前是單機,現在配置叢集)
7001yml檔案
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服務端的執行個體名字
client:
register-with-eureka: false #表識不向注冊中心注冊自己
fetch-registry: false #表示自己就是注冊中心,職責是維護服務執行個體,并不需要去檢索服務
service-url:
defaultZone: http://eureka7002.com:7002/eureka/ #設定與eureka server互動的位址查詢服務和注冊服務都需要依賴這個位址
7002yml檔案
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服務端的執行個體名字
client:
register-with-eureka: false #表識不向注冊中心注冊自己
fetch-registry: false #表示自己就是注冊中心,職責是維護服務執行個體,并不需要去檢索服務
service-url:
defaultZone: http://eureka7001.com:7001/eureka/ #設定與eureka server互動的位址查詢服務和注冊服務都需要依賴這個位址
5,把Eureka7001主啟動類上的注解複制到7002上即可啟動7002
6,把服務提供者(8001)注冊到7001和7002上修改8001yml檔案
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #叢集版
7,把服務消費者(80)注冊到Eureka上修改80yml檔案
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #叢集版
8,測試
1,先啟動Eureka 7001和7002服務
2,在啟動8001
3,啟動80
4,通路一個寫好的接口http://localhost/consumer/payment/get/31
5,有傳回值說明叢集搭建成功
9,服務提供者(8001)叢集環境搭建,參照8001建立8002
10,修改8002pom檔案
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
11,修改Eureka7001,7002YML
7001yml
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服務端的執行個體名字
client:
register-with-eureka: false #表識不向注冊中心注冊自己
fetch-registry: false #表示自己就是注冊中心,職責是維護服務執行個體,并不需要去檢索服務
service-url:
defaultZone: http://eureka7002.com:7002/eureka/ #設定與eureka server互動的位址查詢服務和注冊服務都需要依賴這個位址
7002yml
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服務端的執行個體名字
client:
register-with-eureka: false #表識不向注冊中心注冊自己
fetch-registry: false #表示自己就是注冊中心,職責是維護服務執行個體,并不需要去檢索服務
service-url:
defaultZone: http://eureka7001.com:7001/eureka/ #設定與eureka server互動的位址查詢服務和注冊服務都需要依賴這個位址
12 在提供者8001,8002中分别建立一個controller
8001controller
@RestController
@Slf4j
public class PaymentController {
@Resource
private PaymentService paymentService;
@Value("${server.port}")
private String serverPort;
@Resource
private DiscoveryClient discoveryClient;
@PostMapping("/payment/create")
public CommonResult create(@RequestBody Payment payment){
int result = paymentService.create(payment);
log.info("插入結果"+result);
if(result>0){
return new CommonResult(200,"插入結果成功,serverPort: "+serverPort,result);
}else {
return new CommonResult(400,"插入結果失敗,serverPort: "+serverPort,null);
}
}
@GetMapping("/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id")Long id){
Payment paymentById = paymentService.getPaymentById(id);
log.info("查詢結果"+paymentById);
if(paymentById!=null){
return new CommonResult(400,"查詢成功,serverPort: "+serverPort,paymentById);
}else {
return new CommonResult(200,"查詢失敗,serverPort: "+serverPort,null);
}
}
@GetMapping("/payment/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();
for (String element:services){
log.info("++++++++++element"+element);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance:instances){
log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}
@GetMapping(value = "/payment/lb")
public String getPaymentLB(){
return serverPort;
}
@GetMapping(value = "/payment/feign/timeout")
public String paymentFeignTimeout(){
try{
TimeUnit.SECONDS.sleep(3);
}catch (InterruptedException e){
e.printStackTrace();
}
return serverPort;
}
}
8002yml
@RestController
@Slf4j
public class PaymentController {
@Resource
private PaymentService paymentService;
@Value("${server.port}")
private String serverPort;
@Resource
private DiscoveryClient discoveryClient;
@PostMapping("/payment/create")
public CommonResult create(@RequestBody Payment payment){
int result = paymentService.create(payment);
log.info("插入結果"+result);
if(result>0){
return new CommonResult(200,"插入結果成功,serverPort: "+serverPort,result);
}else {
return new CommonResult(400,"插入結果失敗,serverPort: "+serverPort,null);
}
}
@GetMapping("/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id")Long id){
Payment paymentById = paymentService.getPaymentById(id);
log.info("查詢結果"+paymentById);
if(paymentById!=null){
return new CommonResult(400,"查詢成功,serverPort: "+serverPort,paymentById);
}else {
return new CommonResult(200,"查詢失敗,serverPort: "+serverPort,null);
}
}
@GetMapping("/payment/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();
for (String element:services){
log.info("++++++++++element"+element);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance:instances){
log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}
@GetMapping(value = "/payment/lb")
public String getPaymentLB(){
return serverPort;
}
@GetMapping(value = "/payment/feign/timeout")
public String paymentFeignTimeout(){
try{
TimeUnit.SECONDS.sleep(3);
}catch (InterruptedException e){
e.printStackTrace();
}
return serverPort;
}
}
13利用Eureka簡單做一個負載均衡
14,在服務消費放80中寫一個Config
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //用于負載均衡機制
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
14,在服務消費者80中寫Controller
@RestController
@Slf4j
public class OrderController {
//使用與叢集 CLOUD-PAYMENT-SERVICE是生成這在eureka上注冊的名稱
public static final String PAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";
@Resource
private RestTemplate restTemplate;
@Resource
private DiscoveryClient discoveryClient;
@Resource
private LoadBalancer loadBalancer;
//postForEntity:傳回對象為postForEntity對象,包含了響應中的一些重要資訊
//比如相應頭,響應狀态碼,響應體等
@GetMapping("/consumer/payment/create")
public CommonResult<Payment> create(Payment payment){
return restTemplate.postForEntity(PAYMENT_URL+"/payment/create",payment,CommonResult.class).getBody();
}
//getForObject傳回對象為響應體中資料裝話成的對象,基本上可以了解為json
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
}
15,測試結果:http://localhost/consumer/payment/get/2
8001,8002交替出現