Eureka註冊中心(九)

在前後端分離架構中,服務層被拆分成了很多的微服務,Spring Cloud中提供服務註冊中 心來管理微服務信息。
爲什麼要用註冊中心?
1、微服務數量衆多,要進行遠程調用就需要知道服務端的ip地址和端口,註冊中心幫助我們管理這些服務的ip和 端口。
2、微服務會實時上報自己的狀態,註冊中心統一管理這些微服務的狀態,將存在問題的服務踢出服務列表,客戶 端獲取到可用的服務進行調用。

Spring Cloud Eureka 是對Eureka的二次封裝,它實現了服務治理的功能,Spring Cloud Eureka提 供服務端與客戶端,服務端即是Eureka服務註冊中心,客戶端完成微服務向Eureka服務的註冊與發現。服務端和客戶端均採用Java語言編寫。下圖顯示了Eureka Server與Eureka Client的關係:
在這裏插入圖片描述
1、Eureka Server是服務端,負責管理各各微服務結點的信息和狀態。
2、在微服務上部署Eureka Client程序,遠程訪問Eureka Client時將自己註冊在Eureka Server。
3、微服務需要調用另一個微服務時從Eureka Server中獲取服務調用地址,進行遠程調用。

Eureka Server搭建:
1、父工程中添加cloud依賴:

<dependency> 
	<groupId>org.springframework.cloud</groupId> 
	<artifactId>spring‐cloud‐dependencies</artifactId> 
	<version>Finchley.SR1</version> 
	<type>pom</type> 
	<scope>import</scope> 
</dependency>

服務器工程添加eureka‐server依賴:

<dependencies> 
	<!‐‐ 導入Eureka服務的依賴 ‐‐> 
	<dependency> 
		<groupId>org.springframework.cloud</groupId> 
		<artifactId>spring‐cloud‐starter‐netflix‐eureka‐server</artifactId> 
	</dependency> 
</dependencies>

2、啓動類添加註解:

@EnableEurekaServer//標識這是一個Eureka服務

3、yml配置文件中添加eureka相關配置

eureka: 
	client: registerWithEureka: false #服務註冊,是否將自己註冊到Eureka服務中 
	fetchRegistry: false #服務發現,是否從Eureka中獲取註冊信息 
	serviceUrl: #Eureka客戶端與Eureka服務端的交互地址,高可用狀態配置對方的地址,單機狀態配置自己(如果 不配置則默認本機8761端口) 
	defaultZone: http://localhost:50101/eureka/ 
	server: 
		enable‐self‐preservation: false #是否開啓自我保護模式 
		eviction‐interval‐timer‐in‐ms: 60000 #服務註冊表清理間隔(單位毫秒,默認是60*1000

4、啓動Eureka Server即可
未完待續。。。

Feign遠程調用
在前後端分離架構中,服務層被拆分成了很多的微服務,微服務遠程調用要用到Feign。
下圖是課程管理服務遠程調用CMS服務的流程圖:
在這裏插入圖片描述
工作流程:
1、cms服務將自己註冊到註冊中心。
2、課程管理服務從註冊中心獲取cms服務的地址。
3、課程管理服務遠程調用cms服務。

Feign是Netflix公司開源的輕量級rest客戶端,使用Feign可以非常方便的實現Http 客戶端。Spring Cloud引入 Feign並且集成了Ribbon實現客戶端負載均衡調用。
Feign測試:
1、在客戶端添加依賴

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency> 
	<groupId>com.netflix.feign</groupId> 
	<artifactId>feign‐okhttp</artifactId> 
</dependency>

2、定義FeignClient接口

@FeignClient(value = XcServiceList.XC_SERVICE_MANAGE_CMS) 
public interface CmsPageClient { 
	@GetMapping("/cms/page/get/{id}") 
	public CmsPage findById(@PathVariable("id") String id); 
}

3、啓動類添加@EnableFeignClients註解
4、測試類進行測試

@Autowired CmsPageClient cmsPageClient; 
@Test 
public void testFeign() { 
	//通過服務id調用cms的查詢頁面接口 
	CmsPage cmsPage = cmsPageClient.findById("5a754adf6abb500ad05688d9"); 
	System.out.println(cmsPage); 
}

Feign工作原理如下:
1、 啓動類添加@EnableFeignClients註解,Spring會掃描標記了@FeignClient註解的接口,並生成此接口的代理 對象
2、 @FeignClient(value = XcServiceList.XC_SERVICE_MANAGE_CMS)即指定了cms的服務名稱,Feign會從註冊中 心獲取cms服務列表,並通過負載均衡算法進行服務調用。
3、在接口方法 中使用註解@GetMapping("/cms/page/get/{id}"),指定調用的url,Feign將根據url進行遠程調用。
Feign注意點
SpringCloud對Feign進行了增強兼容了SpringMVC的註解 ,我們在使用SpringMVC的註解時需要注意:
1、feignClient接口 有參數在參數必須加@PathVariable(“XXX”)和@RequestParam(“XXX”)
2、feignClient返回值爲複雜對象時其類型必須有無參構造函數。

Ribbon
Ribbon是一個基於HTTP、 TCP的客戶端負載均衡器。
負載均衡是微服務架構中必須使用的技術,通過負載均衡來實現系統的高可用、集羣擴容等功能。負載均衡可通過 硬件設備及軟件來實現,硬件比如:F5、Array等,軟件比如:LVS、Nginx等。
負載均衡的架構圖:
在這裏插入圖片描述
負載均衡算法有:輪訓、隨機、加權輪訓、加權隨機、地址哈希等方法,負載均衡器維護一份服務列表,根據負載均衡算法 將請求轉發到相應的微服務上,所以負載均衡可以爲微服務集羣分擔請求,降低系統的壓力。
什麼是客戶端負載均衡?
上圖是服務端負載均衡,客戶端負載均衡與服務端負載均衡的區別在於客戶端要維護一份服務列表,Ribbon從 Eureka Server獲取服務列表,Ribbon根據負載均衡算法直接請求到具體的微服務,中間省去了負載均衡服務。
如下圖是Ribbon負載均衡的流程圖:
在這裏插入圖片描述
1、在消費微服務中使用Ribbon實現負載均衡,Ribbon先從EurekaServer中獲取服務列表。
2、Ribbon根據負載均衡的算法去調用微服務。
Spring Cloud引入Ribbon配合 restTemplate 實現客戶端負載均衡。
\color{#FF0000}{創建的獨立的模塊相當於服務端,管理中心模塊相當於客戶端}

環境搭建:
1、在客戶端課程管理添加Ribbon依賴:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
	<groupId>com.squareup.okhttp3</groupId>
	<artifactId>okhttp</artifactId>
</dependency>

由於依賴了spring-cloud-starter-eureka,會自動添加spring-cloud-starter-ribbon依賴,當引入eureka後可以不添加ribbon依賴;
2、在yml中配置ribbon參數:

ribbon: 
	MaxAutoRetries: 2 #最大重試次數,當Eureka中可以找到服務,但是服務連不上時將會重試 
	MaxAutoRetriesNextServer: 3 #切換實例的重試次數 
	OkToRetryOnAllOperations: false #對所有操作請求都進行重試,如果是get則可以,如果是post,put等操作 沒有實現冪等的情況下是很危險的,所以設置爲false 
	ConnectTimeout: 5000 #請求連接的超時時間 
	ReadTimeout: 6000 #請求處理的超時時間

3、定義RestTemplate,使用@LoadBalanced註解
4、啓動兩個cms服務,注意端口要不一致
添加@LoadBalanced註解後,restTemplate會走LoadBalancerInterceptor攔截器,此攔截器中會通過 RibbonLoadBalancerClient查詢服務地址,可以在此類打斷點觀察每次調用的服務地址和端口,兩個cms服務會輪 流被調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章