您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“SpringCloud怎么實現服務調用feign、熔斷hystrix和網關gateway”,內容詳細,步驟清晰,細節處理妥當,希望這篇“SpringCloud怎么實現服務調用feign、熔斷hystrix和網關gateway”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
springcloud架構的認識
我們之前測試過eureka服務注冊功能,它能很好的保存服務之間的通訊關系,是維系微服務通訊網之間的電話本,同時也能夠以心跳檢測的形式監聽每一個微服務的生命狀態,對于結點進行很好的監控。那么我們今天的服務調用就是將接口變得易于管理,更簡單的去調用分布式系統內的微服務。而對于同一時間大量調用的某一個微服務來說它的壓力是巨大了,但是出于用戶體驗的原因,我們必須對用戶返回什么,對前端給出一個響應,而不是掛出404或者非常慢的響應。那么熔斷降級的處理就是非常合適的做法。另外我們對于分布式調用微服務的形式也應、配置一個類似于nignx之類的主機進行反向的分發。在我們的cloud生態立提供了gateway網關組件去實現請求的分發與微服務路由的管理。
那么就讓我們用上次測試eureka的項目進行測試:
首先是利用feign組件實現服務調用與熔斷降級(這里的熔斷可以自行去配置,默認是超過1秒沒給出響應就返回熔斷的降級響應):
<!--引入feign服務調用--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
以上是feign的依賴,我們之前的項目采取的是父工程pom繼承體系,便于管理公共依賴。
/*開啟服務調用Feign的使用*/ @EnableFeignClients
在orderApplication類上打上開啟feign服務組件的注解。
這里先介紹如何使用feign實現簡單的微服務調用:
我們需要有接口作為一個product服務調用的客戶端(可以含有很多這樣的客戶端,便于管理不同的微服務調用接口)當前我們是order模塊:
/*對應調用的微服務名稱*/ @FeignClient(name = "product") public interface FeignInterface { /*對應微服務的訪問路徑*/ @GetMapping("/product/{id}") Product findById(@PathVariable("id")int id); }
然后我們就可以利用自動注入的形式在controller里優化接口了:
@Autowired private FeignInterface feignInterface; @GetMapping("/buyByFeign/{id}") public Product getProductByFeign(@PathVariable("id") int id) { return feignInterface.findById(id); }
細心的同志可以看到之前的controller接口是這樣的:
@Autowired private RestTemplate restTemplate; @RequestMapping(value = "/buy/{id}", method = RequestMethod.GET) public Product getProductById(@PathVariable("id") int id) { return restTemplate.getForObject("http://product/product/" + id, Product.class); }
兩相對比,我們發現feign服務調用的形式完全不需要寫任何請求語句,也不需要處理與product微服務之間的響應。瀏覽器訪問時依舊按照order接口上的路徑去寫即可。
其次介紹一下feign實現的熔斷:
我們對某一個微服務調用路線準備熔斷:舉個例子,本文主要是order與product模塊之間的調用關系,因此熔斷也就是處理從order到product模塊之間的請求路線:
下一個實現類去實現feign服務調用接口實現的方法就是我們的熔斷方法(注意這里開啟熔斷器服務的注解也需打在orderApplication類上,在下面介紹hystrix時會給出來):
@Component("feignHystrix") public class FeignHystrix implements FeignInterface{ public Product findById(int id) { Product product = new Product(); product.setId(-1); product.setProductName("服務熔斷"); return product; } }
要打上spring組件注解交給spring管理,不然跑起來就是一個沒有實例化的字節碼文件,根本用不了。
其次我們需要告訴feign客戶端,你這條調用線路的熔斷降級處理類型:
@FeignClient(name = "product",fallback = FeignHystrix.class) public interface FeignInterface { @GetMapping("/product/{id}") Product findById(@PathVariable("id")int id); }
fallback = FeignHystrix.class就是確定熔斷降級類型的配置。
這樣的方式就可以實現feign的服務調用與熔斷降級了。但是會出現直接就是熔斷方法的響應,原因是在controller層的自動注入會直接默認你注入的是接口的實現類型,這里我們最好是綁定一下name。
其次我們來換一種熔斷處理,也就是利用hystrix去實現服務調用關系間的熔斷處理:
<!--引入服務熔斷hystrix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.2.10.RELEASE</version> </dependency>
以上是它的依賴,hystrix組件用起來也是十分的簡單,會對你的要求進行不同的配置,這里本文只展示最基本的使用舉例:
/*開啟熔斷器*/ @EnableCircuitBreaker
記住在Application類上開啟熔斷器才行,基本的使用十分簡單就是直接在controller接口類里這么寫就可以:
@Autowired private RestTemplate restTemplate; @RequestMapping(value = "/buy/{id}", method = RequestMethod.GET) @HystrixCommand(fallbackMethod = "getProductFallBack") //給接口配置hystrix熔斷降級方法 public Product getProductById(@PathVariable("id") int id) { try { Thread.sleep(2000); } catch (InterruptedException e) { System.out.println("睡兩秒等熔斷"); } return restTemplate.getForObject("http://product/product/" + id, Product.class); } /*hystrix降級方法必須與熔斷方法保持一致參數,一致返回類型*/ public Product getProductFallBack(int id) { Product product = new Product(); product.setId(-1); product.setProductName("服務熔斷"); return product; }
注意這個降級的方法是有要求的,參數類型與返回值要與接口方法一致。你也可以建立一個新的類型里面統一的書寫降級方法,調用時配置上類型與方法的路徑即可(默認是1秒不給響應就采取熔斷降級,所以直接開線程睡2秒測試熔斷響應)。
注冊中心與服務發現可以使得微服務之間鴿子能夠查詢到各自的存在,不需要開發者手動的配置各個微服務的路由。服務調用與熔斷降級有效的將微服務之間的調用與流量的壓力進行了管控與優化,但是由客戶端或者是瀏覽器發送來的請求如果還是直接ip加端口加訪問路徑的話,未必就太麻煩了?這樣對于前端開發來說也是很大的痛點!所以nignx反向代理很受歡迎,也是采用一個nignx.conf文件作為內部系統服務接口的通訊錄,外部請求統一ip與端口只需要給我你想要訪問的服務名稱我就可以幫你通訊。這也就是網關的基本功能。當然如果簡單的路由分發nignx完全可以充當網關的角色,這里我們先介紹一下gateway組件的基本使用:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
以上是gateway的依賴,我們需要前置知道的是gateway與spring web有沖突,所以最好不要安裝web的依賴,如果和我一樣是父工程pom管理的可以在application.yml文件配置這一項解決沖突:
spring:
application:
name: gateway
main:
web-application-type: reactive
其次就是網關的配置信息了(你不需要寫任何類型文件,只需要淺淺的配置一下yml文件):
spring:
cloud:
gateway:
routes:
- id: order
uri: http://127.0.0.1:9002
predicates:
- Path=/order/**
- id: product
uri: http://127.0.0.1:9001
predicates:
- Path=/product/**
這個routers像極了view項目里我們書寫的router.js里的routes[]數組的內容,微服務注冊名稱,微服務內部訪問路徑,微服務默認的訪問入口(這里的入口是controller類型上打的@RequestMapping內容,后面的二級三級就是我們需要填寫訪問的)舉個例子(gateway默認的端口是8080)我們現在需要訪問order微服務的buy/1去查1號商品,之前我們的訪問方式是:http://127.0.0.1:9002/order/buy/1
現在配置完以上的網關內容后我們只需要訪問localhost:8080/order/buy/1(注意這個order是代表微服務名稱,也就是你配置的id,可不是controller類型的一級路由)。
讀到這里,這篇“SpringCloud怎么實現服務調用feign、熔斷hystrix和網關gateway”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。