最近在寫中臺,就是各功能板塊各司其職,最後根據須要整合在一塊兒搭建成一個完整的系統,有了解的小夥伴都知道,這裏用的其實就是微服務。html
過程當中,各工程模塊之間有大量的相互鏈接調用的部分。這種場景最先的作法是借用代理實現,後來Spring Cloud 封裝了一個Spring Cloud Rbbon,能夠利用RestTemplate 的請求攔截來實現對依賴服務的接口調用。項目中對服務依賴的調用每每會有多處,因此一般會針對各個微服務自行封裝一些客戶端來包裝這些依賴服務的調用,故幾乎每個調用都是簡單的模塊化內容。git
而Spring Cloud Feign 作了進一步的封裝,在Fegin的基礎上,咱們只須要建立一個接口並使用 @FeignClient 註解來配置,便可完成對服務提供方的接口綁定,簡化了使用 Spring Cloud Ribbon 時自行封裝服務調用客戶端的開發量。 github
一、準備spring
1)啓動 Eureka服務註冊中心;json
2)建立兩個微服務A(服務提供者)、B(服務消費者);app
3) A服務的 application.name = "A-service", B 服務 application.name = "B-service";負載均衡
4)A 服務提供服務接口 A1,B 服務的 B1 功能模塊中調須要用 A1;maven
5)在 A、B 服務的 application.yml 文件中加入 Eureka 配置信息,如:模塊化
eureka: client: healthcheck: enabled: true serviceUrl: defaultZone: http://localhost:8112/eureka/ enabled: true instance: hostname: localhost ip-address: localhost non-secure-port: 8088 instance-id: baas-bbw-transfer:${eureka.instance.ip-address}:${eureka.instance.non-secure-port} lease-expiration-duration-in-seconds: 30 lease-renewal-interval-in-seconds: 10
6)A1 提供相應的方法接口,如 query()方法;微服務
二、Fegin 客戶端定義(maven 依賴等等再也不贅述)
@FeignClient(name = "A-service", decode404 = true) public interface A1Client extends A1Api{ }
2)服務調用
@RestController @RequestMapping(value = "/b1", produces = "application/json;charset=utf-8") public class B1Controller { @Autowired private A1Client a1client; @PostMapping("/query") private BaasResponse<List<B1業務實體類>> query( @RequestBody MappingFilter filter) throws BaasException { return a1client.query(tenant, filter); } }
至此,B 服務中就實現了一次對於 A 服務中 A1 模塊 query()方法的調用,整個過程簡單的像是調用了服務內部的方法。
一、若是 A、B兩個微服務不是不一樣的 eureka 中,那在使用 @Fegin 註解時,須要在註解中添加 url ,去指明 A 服務的全路徑訪問地址,以保證 B 能正確的向 A 發送請求。此時,@Fegin 的使用如:
//這裏用127.0.0.1:8080代替 A 服務地址 @FeignClient(name = "A-service", url = "127.0.0.1:8080", decode404 = true) public interface A1Client extends A1Api{ }
二、因爲在 url 寫入固定的地址,可能會致使負載均衡失去做用(除非指定的地址是網關地址),故一般的作法是在 application.yml 文件中,加入一個配置,在 url 中使用 ${}取值的方式去獲取配置的服務地址(這種方式多用於開發本地測試)。如:
//application.yml
A-service: application: name:A-service url:localhost:port
此時,調用如:
//這裏用127.0.0.1:8080代替 A 服務地址 @FeignClient(name = "${A-service.application.name}", url = "${A-service.application.url}", decode404 = true) public interface A1Client extends A1Api{ }
Spring cloud Fegin 基本的使用過程已介紹完畢~~~~回去繼續擼代碼。
最近在看我「現男朋友」強推的《羅生門》,多是我這種理科女不太適合這種隱喻性太強的小說吧,看的不知所謂~~道行仍是不夠哇!!