SpringBoot使用Feign調用其他服務接口
使用SpringCloud的Feign組件能夠為服務間的調用節省編碼時間並提高開發效率,當服務本身不復雜時可以單獨將該組件拿出使用。
引入依賴
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.0.4.RELEASE</version> </dependency>
引入SpringBoot打包的Feign依賴,需要註意的是Feign的版本與SpringBoot版本的對應關系,老版本的Feign並不叫openfeign。由於我是用的SpringBoot版本是2.0x,所以openfeign使用瞭2.0x版本,若使用諸如2.1x或其他高版本的openfeign,在項目啟動時會報“抽象方法錯誤”這類的異常。
編寫接口作為服務調用入口
import com.bhz.demo.client.domain.req.ProductReceiveReq; import com.bhz.demo.client.domain.resp.MemberPointBaseResp; import com.bhz.demo.client.domain.resp.UserPointResp; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * @Author guomz * @create 2021/3/15 14:50 */ @FeignClient(url = "www.123.com", name = "demoClient") public interface DemoClient { @RequestMapping(value = "/demo/user/{uuid}/{name}", method = RequestMethod.GET) DemoBaseResp<DemoUserResp> getUser(@PathVariable("uuid") String uuid, @PathVariable("name") String name); @RequestMapping(value = "/demo/buy", method = RequestMethod.POST) DemoBaseResp buyProduct(DemoBuyReq req); }
Feign的服務調用編寫類似mybatis的dao接口,接口上方需要標註@FeignClient註解,該註解有url、name、value三個重要參數。其中name與value等效,必須填寫一個。在微服務環境下name或value填寫用於被註冊中心發現的服務名,例如調用的用戶服務叫userService則此處填寫userService,此使url可以不填寫,因為已經指定瞭調用方。url則是直接指定服務的全路徑,若同時填寫url與name,則以url為準,name便被當作當前客戶端的名稱。
上面的示例並不屬於復雜的微服務環境,所以采用直接指定url來調用其他服務。
方法定義上與controller基本一致,需要註意post方法不能傳遞多個參數,需要用map或對象進行封裝。
調用服務
@Service @Slf4j public class DemoService { @Autowired private DemoClient demoClient; public void getUser(Long id){ demoClient.getUser("123", "abc"); } }
在需要調用其他服務的模塊中引入之前定義的接口即可。
關於調用https接口
調用https接口時會進行證書校驗,若沒有證書則會拋出No subject alternative names present異常,可以使用以下代碼來繞過證書校驗:
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-ribbon --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.0.4.RELEASE</version> </dependency>
首先需要引入Ribbon依賴,在繞過證書的代碼中存在一些需要被註入的類屬於Ribbon。Ribbon的引入同樣需要註意版本問題。
import feign.Client; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory; import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.net.ssl.*; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.cert.X509Certificate; /**feign client配置 * @Author guomz * @create 2021/3/16 9:52 */ @Configuration public class FeignConfiguration { /** * 調用https接口時繞過ssl證書驗證 * @param cachingFactory * @param clientFactory * @return * @throws NoSuchAlgorithmException * @throws KeyManagementException */ @Bean @ConditionalOnMissingBean public Client feignClient(@Qualifier("cachingLBClientFactory") CachingSpringLoadBalancerFactory cachingFactory, SpringClientFactory clientFactory) throws NoSuchAlgorithmException, KeyManagementException { SSLContext ctx = SSLContext.getInstance("TLSv1.2"); X509TrustManager tm = new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] x509Certificates, String s) { } @Override public void checkServerTrusted(X509Certificate[] x509Certificates, String s) { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }; ctx.init(null, new TrustManager[]{tm}, null); return new LoadBalancerFeignClient(new Client.Default(ctx.getSocketFactory(), new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession sslSession) { return true; } }), cachingFactory, clientFactory); } }
之後是Feign的配置類,用來繞過https證書校驗。
到此這篇關於SpringBoot使用Feign調用其他服務接口的文章就介紹到這瞭,更多相關SpringBoot Feign調用服務接口內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 淺談SpringCloud之Ribbon詳解
- SpringCloud學習筆記之OpenFeign進行服務調用
- Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例
- 一篇文章教你如何在SpringCloud項目中使用OpenFeign
- OpenFeign服務接口調用的過程詳解