最近接觸微服務這塊的東西,對這方面有了一些了解,拿出來和大家分享一下。
1. 微服務框架Spring Boot+Spring Cloud
Spring Cloud是基于Spring Boot的一整套實現微服務的框架,可以說,Spring Boot作為框架,Spring Cloud作為微服務,一起構成了一種不可忽視的、新生的框架體系。它提供了微服務開發所需的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分布式會話和集群狀態管理等組件,方便易用。Spring Cloud包含了非常多的子框架,其中,Spring Cloud Netflix是其中一套框架,它主要提供的模塊包括:服務發現、斷路器和監控、智能路由、客戶端負載均衡等。
特性
- Eureka實例可以注冊和發現使用spring管理的bean
- 嵌入式Eureka服務器可以用聲明式的Java配置創建
- Hystrix客戶端可以用簡單的注解驅動
- Java配置可以啟用嵌入的Hystrix指示面板
- 客戶端負載均衡
2. Spring Cloud Netflix組件以及部署
(1)Eureka,服務注冊和發現,它提供了一個服務注冊中心、服務發現的客戶端,還有一個方便的查看所有注冊的服務的界面。 所有的服務使用Eureka的服務發現客戶端來將自己注冊到Eureka的服務器上。
(2)Zuul,網關,所有的客戶端請求通過這個網關訪問后臺的服務。他可以使用一定的路由配置來判斷某一個URL由哪個服務來處理。并從Eureka獲取注冊的服務來轉發請求。
(3)Ribbon,即負載均衡,Zuul網關將一個請求發送給某一個服務的應用的時候,如果一個服務啟動了多個實例,就會通過Ribbon來通過一定的負載均衡策略來發送給某一個服務實例。
(4)Feign,服務客戶端,服務之間如果需要相互訪問,可以使用RestTemplate,也可以使用Feign客戶端訪問。它默認會使用Ribbon來實現負載均衡。
(5)Hystrix,監控和斷路器。我們只需要在服務接口上添加Hystrix標簽,就可以實現對這個接口的監控和斷路器功能。
(6)Hystrix Dashboard,監控面板,他提供了一個界面,可以監控各個服務上的服務調用所消耗的時間等。
(7)Turbine,監控聚合,使用Hystrix監控,我們需要打開每一個服務實例的監控信息來查看。而Turbine可以幫助我們把所有的服務實例的監控信息聚合到一個地方統一查看。
3. Spring Cloud Netflix組件開發
可以參考其中文文檔:https://springcloud.cc/spring-cloud-netflix.html
(1)服務注冊與監控中心:
1
2
3
4
5
6
7
8
|
@SpringBootApplication @EnableEurekaServer @EnableHystrixDashboard public class ApplicationRegistry { public static void main(String[] args) { new SpringApplicationBuilder(Application. class ).web( true ).run(args); } } |
這里使用spring boot標簽的 @SpringBootApplication 說明當前的應用是一個spring boot應用。這樣我就可以直接用main函數在IDE里面啟動這個應用,也可以打包后用命令行啟動。當然也可以把打包的war包用tomcat之類的服務器啟動。 使用標簽 @EnableEurekaServer ,就能在啟動過程中啟動Eureka服務注冊中心的組件。它會監聽一個端口,默認是8761,來接收服務注冊。并提供一個web頁面,打開以后,可以看到注冊的服務。 添加 @EnableHystrixDashboard 就會提供一個監控的頁面,我們可以在上面輸入要監控的服務的地址,就可以查看啟用了Hystrix監控的接口的調用情況。 當然,為了使用上面的組件,我們需要在maven的POM文件里添加相應的依賴,比如使用 spring-boot-starter-parent ,依賴 spring-cloud-starter-eureka-server 和 spring-cloud-starter-hystrix-dashboard 等。
(2)服務間調用:
兩種方式可以進行服務調用,RestTemplate和FeignClient。不管是什么方式,他都是通過REST接口調用服務的http接口,參數和結果默認都是通過jackson序列化和反序列化。因為Spring MVC的RestController定義的接口,返回的數據都是通過jackson序列化成json數據。
第一種:RestTemplate,只需要定義一個RestTemplate的Bean,設置成 LoadBalanced 即可:
1
2
3
4
5
6
7
8
|
@Configuration public class SomeCloudConfiguration { @LoadBalanced @Bean RestTemplate restTemplate() { return new RestTemplate(); } } |
這樣我們就可以在需要用的地方注入這個bean使用:
1
2
3
4
5
6
7
8
|
public class SomeServiceClass { @Autowired private RestTemplate restTemplate; public String getUserById(Long userId) { UserDTO results = restTemplate.getForObject( "http://users/getUserDetail/" + userId, UserDTO. class ); return results; } } |
其中, users 是服務ID,Ribbon會從服務實例列表獲得這個服務的一個實例,發送請求,并獲得結果。對象 UserDTO 需要序列號,它的反序列號會自動完成。
第二種:FeignClient
1
2
3
4
5
|
@FeignClient (value = "users" , path = "/users" ) public interface UserCompositeService { @RequestMapping (value = "/getUserDetail/{id}" , method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) UserDTO getUserById( @PathVariable Long id); } |
我們只需要使用 @FeignClient 定義一個借口,Spring Cloud Feign會幫我們生成一個它的實現,從相應的users服務獲取數據。 其中, @FeignClient(value = "users", path = "/users/getUserDetail") 里面的value是服務ID,path是這一組接口的path前綴。 在下面的方法定義里,就好像設置Spring MVC的接口一樣,對于這個方法,它對應的URL是 /users/getUserDetail/{id} 。 然后,在使用它的時候,就像注入一個一般的服務一樣注入后使用即可:
1
2
3
4
5
6
7
8
9
|
public class SomeOtherServiceClass { @Autowired private UserCompositeService userService; public void doSomething() { // ..... UserDTO results = userService.getUserById(userId); // other operation... } } |
(3)斷路器:
1
2
3
4
5
6
7
8
9
10
11
|
//斷路器:為了解決當某個方法調用失敗的時候,調用后備方法來替代失敗的方法,已達到容錯/阻止級聯錯誤的功能 //fallbackMethod指定后備方法 @HystrixCommand (fallbackMethod = "doStudentFallback" ) @RequestMapping (value = "dostudent" ,method = RequestMethod.GET) public String doStudent(){ return "your name:secret,your age:secret!" ; } public String doStudentFallback(){ return "your name:FEIFEI,your age:26!" ; } |
其中,使用@EnableCircuitBreaker來啟用斷路器支持,Spring Cloud提供了一個控制臺來監控斷路器的運行情況,通過@EnableHystrixDashboard注解開啟。
以上是簡單的一些對Spring Cloud Netflix組件的介紹。希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://my.oschina.net/u/3747963/blog/1592777