最近接觸微服務這塊的東西,對這方面有了一些瞭解,拿出來和你們分享一下。html
Spring Cloud是基於Spring Boot的一整套實現微服務的框架,能夠說,Spring Boot做爲框架,Spring Cloud做爲微服務,一塊兒構成了一種不可忽視的、新生的框架體系。它提供了微服務開發所需的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分佈式會話和集羣狀態管理等組件,方便易用。Spring Cloud包含了很是多的子框架,其中,Spring Cloud Netflix是其中一套框架,它主要提供的模塊包括:服務發現、斷路器和監控、智能路由、客戶端負載均衡等。java
2. Spring Cloud Netflix組件以及部署web
(1)Eureka,服務註冊和發現,它提供了一個服務註冊中心、服務發現的客戶端,還有一個方便的查看全部註冊的服務的界面。 全部的服務使用Eureka的服務發現客戶端來將本身註冊到Eureka的服務器上。spring
(2)Zuul,網關,全部的客戶端請求經過這個網關訪問後臺的服務。他可使用必定的路由配置來判斷某一個URL由哪一個服務來處理。並從Eureka獲取註冊的服務來轉發請求。json
(3)Ribbon,即負載均衡,Zuul網關將一個請求發送給某一個服務的應用的時候,若是一個服務啓動了多個實例,就會經過Ribbon來經過必定的負載均衡策略來發送給某一個服務實例。tomcat
(4)Feign,服務客戶端,服務之間若是須要相互訪問,可使用RestTemplate,也可使用Feign客戶端訪問。它默認會使用Ribbon來實現負載均衡。服務器
(5)Hystrix,監控和斷路器。咱們只須要在服務接口上添加Hystrix標籤,就能夠實現對這個接口的監控和斷路器功能。app
(6)Hystrix Dashboard,監控面板,他提供了一個界面,能夠監控各個服務上的服務調用所消耗的時間等。負載均衡
(7)Turbine,監控聚合,使用Hystrix監控,咱們須要打開每個服務實例的監控信息來查看。而Turbine能夠幫助咱們把全部的服務實例的監控信息聚合到一個地方統一查看。框架
3. Spring Cloud Netflix組件開發
能夠參考其中文文檔:https://springcloud.cc/spring-cloud-netflix.html
(1)服務註冊與監控中心:
@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
便可:
@Configuration public class SomeCloudConfiguration { @LoadBalanced @Bean RestTemplate restTemplate() { return new RestTemplate(); } }
這樣咱們就能夠在須要用的地方注入這個bean使用:
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
@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}
。 而後,在使用它的時候,就像注入一個通常的服務同樣注入後使用便可:
public class SomeOtherServiceClass { @Autowired private UserCompositeService userService; public void doSomething() { // ..... UserDTO results = userService.getUserById(userId); // other operation... } }
(3)斷路器:
//斷路器:爲了解決當某個方法調用失敗的時候,調用後備方法來替代失敗的方法,已達到容錯/阻止級聯錯誤的功能 //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組件的介紹。