- Nacos(服務發現/注冊中心)
- Nacos是構建以“服務”為中心的現代應用架構(微服務范式、云原生范式)的服務基礎設施
- Nacos快速實作動態服務發現、服務配置、服務元資料及流量管理,更敏捷和容易地構建、交付和管理微服務平臺,
- 常見的注冊中心
- Eureka(原生,2.0版本遇到性能瓶頸期,現已停止維護)
- Zookeeper(支持,專業的獨立產品,如Dubbo)
- Consul(原生,采用GO語言開發)
- Nacos(推薦使用)
- Nacos的使用流程
- 事先說明:假設現在A服務呼叫B服務的方法
- 將A服務和B服務都在Nacos注冊中心中注冊
- 根據注冊中心提供的地址,A服務才可以呼叫B服務
- 這里說的服務是小專案工程(maven工程)
- 安裝Nacos,注意
SpringBoot和SpringCloud和Nacos的版本對應 - 雙擊
startup.cmd啟動nacos,在瀏覽器中輸入 http://localhost:8848/nacos- username: nacos
- password: nacos
- 盡量在外層(包含A、B服務的pom.xml)中引入依賴
<!--服務注冊--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> - 在要注冊服務(即A、B服務,兩服務都要)的組態檔中配置Nacos地址
# Nacos服務地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 - 在要注冊服務(即A、B服務,兩服務都要)的啟動類中添加注解
EnableDiscoveryClient - 啟動服務即可在Nacos中看到
- 事先說明:假設現在A服務呼叫B服務的方法
- Feign(服務呼叫)
- 盡量在外層(包含A、B服務的pom.xml)中引入依賴
<!--服務注冊--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> - 在呼叫端服務(即A服務)啟動類中添加注解
EnableFeignClients - 在呼叫端服務(即A服務)創建一個介面,使用注解指定呼叫服務名稱,定義呼叫的方法路徑
- 添加注解FeignClient("被呼叫端服務名稱(即B服務)")
- 指定方法(可從被呼叫端控制類中復制,這樣不會出錯,另外注解PathVariable中需指定引數名稱)
- 示例如下
package com.xsha.eduservice.client; import com.xsha.commonutils.R; import com.xsha.servicebase.exceptionhandler.MyException; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; @FeignClient("serviceB") @Component public interface VodClient { // 呼叫的路徑寫完整 @ApiOperation(value = "https://www.cnblogs.com/aitiknowledge/p/洗掉視頻") @DeleteMapping("/eduvod/video/deleteAlyVideo/{videoId}") public R deleteAliyunVideo(@ApiParam(name = "videoId", value = "https://www.cnblogs.com/aitiknowledge/p/視頻ID") @PathVariable("videoId") String videoId) throws MyException; }
- 最后在呼叫端服務(A服務)控制類(或者其他層上的類)中注入上面創建的介面即
@Autowired private VodClient vodClient,現在就可以呼叫B服務的控制類方法了
- 盡量在外層(包含A、B服務的pom.xml)中引入依賴
- Spring Cloud在介面呼叫上,大致會經過如下幾個組件
- 介面化請求呼叫 -> Feign -> Hystrix -> Ribbon -> Http Client(apache http components 或者 Okhttp)
- 說明
介面化請求呼叫當呼叫被注解FeignClient修飾的介面時,在框架內部將請求轉換成Feign的請求實體feign.Request,交由Feign框架處理Feign(服務呼叫)轉化請求Feign是一個http請求呼叫的輕量級框架,可以以Java介面注解的方式呼叫Http請求,封裝了Http呼叫流程Hystrix(熔斷器)熔斷處理機制Feign的呼叫關系,會被Hystrix代理攔截,對每一個Feign呼叫請求,Hystrix都會將其包裝成HystrixCommand,
參與Hystrix的流控和熔斷規則,如果請求判斷需要熔斷,則Hystrix直接熔斷,拋出例外或者使用FallbackFactory回傳熔斷Fallback結果,如果通過,
則將呼叫請求傳遞給Ribbon組件Ribbon(負載均衡)主要是當請求傳遞到Ribbon之后,Ribbon會根據自身維護的服務串列、服務質量等(平均回應時間,Load)結合特定的規則,
從串列中挑選合適的服務實體,選擇好機器之后,然后將機器實體的資訊請求傳遞給Http Client客戶端,Http Client客戶端來執行真正的Http介面呼叫Http Client(客戶端)真正執行Http呼叫,根據上層Ribbon傳遞過來的請求,已經指定了服務地址,則Http Client開始執行真正的請求
- Hystrix(熔斷器)
- 匯入依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> - 呼叫端(A服務)組態檔中開啟熔斷器
# 開啟熔斷器 feign.hystrix.enabled=true # 設定熔斷器超時時間,默認1000ms hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000 - 呼叫端(A服務)創建上述為服務呼叫(VodClient)介面的實作類,并實作出錯之后的功能方法
package com.xsha.eduservice.client; import com.xsha.commonutils.R; import com.xsha.servicebase.exceptionhandler.MyException; import org.springframework.stereotype.Component; import java.util.List; @Component public class VodFileDegradeFeignClient implements VodClient { @Override public R deleteAliyunVideo(String videoId) throws MyException { return R.error().message("洗掉視頻出錯了!"); } @Override public R deleteVideoBatch(List<String> videoList) throws MyException { return R.error().message("批量洗掉視頻出錯了!"); } } - 在介面上注解FeignClient中添加fallback屬性及值
@FeignClient(name="service-vod", fallback=VodFileDegradeFeignClient.class) - 這時呼叫端(A服務)呼叫被呼叫端(B服務)的方法時,就可以根據回傳值,根據需求完成更合理的介面(如拋出例外等)
R result = vodClient.deleteAliyunVideo(videoSourceId); if(result.getCode() == 20001) { throw new MyException(20001, "洗掉視頻失敗,熔斷器,,,"); }
- 匯入依賴
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435332.html
標籤:Java
上一篇:八大排序演算法之直接插入排序(InsertionSort)
下一篇:curl的HTTP引數速查表
