前一篇文章寫了如何使用
eureka來進行服務的注冊與發(fā)現(xiàn)。這篇記錄下,如何使用eureka進行服務注冊中心的高可用性、服務調(diào)用、負載均衡。
- 先看一下配置表。
| 應用名稱 | eureka-server | eureka-service | eureka-customer |
|---|---|---|---|
| 端口 | 9000-9099 | 9100-9199 | 9200-9299 |
| 說明 | 提供注冊服務 | 服務本身 | 消費服務 |
初始化3個eureka-server項目
- 如何初始化項目,使用的注解等這里就不寫了,在第一篇里有。其三個項目的配置文件分別為:
# 服務注冊中心
spring.application.name=eureka-server
server.port=9000
#####################################
### eureka 實例配置###################
#####################################
eureka.instance.hostname=eureka-server0
# eureka 客戶端(發(fā)布的業(yè)務服務)向 eureka 服務中心發(fā)送心跳,表示該客戶端依然存在,
# 如果在 leaseExpirationDurationInSeconds 時間內(nèi)沒有收到心跳,則服務中心會把實例從視圖移除
eureka.instance.lease-renewal-interval-in-seconds=4
# 發(fā)送心跳時,等待接收心跳的最大時間。該值應該大于 leaseRenewalIntervalInSeconds
# 如果該值太大,則很可能將流量轉(zhuǎn)發(fā)過去的時候,該實例已不可用
# 如果該值太小,則實例很可能因為臨時的網(wǎng)絡抖動而被移除
eureka.instance.lease-expiration-duration-in-seconds=6
#####################################
### eureka 客戶端配置(發(fā)布的業(yè)務服務)##
#####################################
# 間隔多久后,從 eureka 服務中心上更新注冊自己的業(yè)務服務
eureka.client.registry-fetch-interval-seconds=5
# eureka 服務中心的地址
eureka.client.serviceUrl.defaultZone=http://eureka-server1:9001/eureka/,http://eureka-server2:9002/eureka/
#####################################
### eureka 服務端配置#################
#####################################
# 清理間隔(單位毫秒,默認是0 不清除)
eureka.server.eviction-interval-timer-in-ms=3000
# 服務注冊中心
spring.application.name=eureka-server
server.port=9001
#####################################
### eureka 實例配置###################
#####################################
eureka.instance.hostname=eureka-server1
# eureka 客戶端(發(fā)布的業(yè)務服務)向 eureka 服務中心發(fā)送心跳,表示該客戶端依然存在,
# 如果在 leaseExpirationDurationInSeconds 時間內(nèi)沒有收到心跳,則服務中心會把實例從視圖移除
eureka.instance.lease-renewal-interval-in-seconds=4
# 發(fā)送心跳時,等待接收心跳的最大時間。該值應該大于 leaseRenewalIntervalInSeconds
# 如果該值太大,則很可能將流量轉(zhuǎn)發(fā)過去的時候,該實例已不可用
# 如果該值太小,則實例很可能因為臨時的網(wǎng)絡抖動而被移除
eureka.instance.lease-expiration-duration-in-seconds=6
#####################################
### eureka 客戶端配置(發(fā)布的業(yè)務服務)##
#####################################
# 間隔多久后,從 eureka 服務中心上更新注冊自己的業(yè)務服務
eureka.client.registry-fetch-interval-seconds=5
# eureka 服務中心的地址
eureka.client.serviceUrl.defaultZone=http://eureka-server0:9000/eureka/,http://eureka-server2:9002/eureka/
#####################################
### eureka 服務端配置#################
#####################################
# 清理間隔(單位毫秒,默認是0 不清除)
eureka.server.eviction-interval-timer-in-ms=3000
# 服務注冊中心
spring.application.name=eureka-server
server.port=9002
#####################################
### eureka 實例配置###################
#####################################
eureka.instance.hostname=eureka-server2
# eureka 客戶端(發(fā)布的業(yè)務服務)向 eureka 服務中心發(fā)送心跳,表示該客戶端依然存在,
# 如果在 leaseExpirationDurationInSeconds 時間內(nèi)沒有收到心跳,則服務中心會把實例從視圖移除
eureka.instance.lease-renewal-interval-in-seconds=4
# 發(fā)送心跳時,等待接收心跳的最大時間。該值應該大于 leaseRenewalIntervalInSeconds
# 如果該值太大,則很可能將流量轉(zhuǎn)發(fā)過去的時候,該實例已不可用
# 如果該值太小,則實例很可能因為臨時的網(wǎng)絡抖動而被移除
eureka.instance.lease-expiration-duration-in-seconds=6
#####################################
### eureka 客戶端配置(發(fā)布的業(yè)務服務)##
#####################################
# 間隔多久后,從 eureka 服務中心上更新注冊自己的業(yè)務服務
eureka.client.registry-fetch-interval-seconds=5
# eureka 服務中心的地址
eureka.client.serviceUrl.defaultZone=http://eureka-server0:9000/eureka/,http://eureka-server1:9001/eureka/
#####################################
### eureka 服務端配置#################
#####################################
# 清理間隔(單位毫秒,默認是0 不清除)
eureka.server.eviction-interval-timer-in-ms=3000
- 之后分別啟動這三個
eureka-server注冊服務中心項目。
啟動后會看到有三個可用的服務注冊中心
初始化2個eureka-service項目
- 如何初始化項目、使用的注解等這里就不寫了,在第一篇里有。2個項目的配置文件分別為:
# 服務提供者
spring.application.name=eureka-service
server.port=9100
# eureka 服務中心的地址
eureka.client.serviceUrl.defaultZone=http://eureka-server0:9000/eureka/,http://eureka-server1:9001/eureka/,http://eureka-server2:9002/eureka/
# 服務提供者
spring.application.name=eureka-service
server.port=9101
# eureka 服務中心的地址
eureka.client.serviceUrl.defaultZone=http://eureka-server0:9000/eureka/,http://eureka-server1:9001/eureka/,http://eureka-server2:9002/eureka/
-
啟動這兩個項目
啟動后服務注冊中心已經(jīng)發(fā)現(xiàn)了這兩個業(yè)務服務
創(chuàng)建服務消費者
- 項目配置文件為:
# 服務消費者
spring.application.name=eureka-customer
server.port=9200
# eureka 服務中心的地址
eureka.client.serviceUrl.defaultZone=http://eureka-server0:9000/eureka/,http://eureka-server1:9001/eureka/,http://eureka-server2:9002/eureka/
EurekaCustomerApplication.java
package com.zb.eurekacustomer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaCustomerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaCustomerApplication.class, args);
}
}
-
RestConfig.java使用RestTemplate發(fā)起真實的rest請求
package com.zb.eurekacustomer.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @author 張博
*/
@Configuration
public class RestConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
-
UserCustomerController.javaLoadBalancerClient是spring cloud提供的一個客戶端負責均衡器。作用是時流量均衡流向每一個服務。
package com.zb.eurekacustomer.c_user.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @author 張博
*/
@RestController
public class UserCustomerController {
private LoadBalancerClient loadBalancerClient;
private RestTemplate restTemplate;
@Autowired
private UserCustomerController(LoadBalancerClient loadBalancerClient, RestTemplate restTemplate) {
this.loadBalancerClient = loadBalancerClient;
this.restTemplate = restTemplate;
}
@RequestMapping(value = "/getServices", method = RequestMethod.GET)
public String getServices() {
// 從 LoadBalancer 中為指定的業(yè)務服務選擇業(yè)務服務實例
ServiceInstance serviceInstance = loadBalancerClient.choose("eureka-service");
String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/getServices/" + serviceInstance.getPort();
System.out.println(url);
return restTemplate.getForObject(url, String.class);
}
}
-
啟動項目
啟動后可以發(fā)現(xiàn)服務消費者出現(xiàn)在了服務注冊中心
演示
-
服務調(diào)用
在瀏覽器中輸入http://127.0.0.1:9200/getServices
發(fā)現(xiàn)可用調(diào)用遠程的服務 -
負載均衡
在瀏覽器中多次刷新http://127.0.0.1:9200/getServices
可以發(fā)現(xiàn)負載均衡可以正常使用,流量被均攤 -
注冊中心的高可用性
我們停掉端口為9001注冊中心
發(fā)現(xiàn)端口為9001不在了

不可用的服務
- 這時我們發(fā)布新的業(yè)務服務。發(fā)現(xiàn)還是可以正常使用。





