日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

OpenFeign组件的使用(使用nacos作为服务注册中心)

發布時間:2025/3/15 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenFeign组件的使用(使用nacos作为服务注册中心) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、OpenFeign介紹

Feign是一個聲明式的偽Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只需要創建一個接口并注解。它具有可插拔的注解特性(可以使用springmvc的注解),可使用Feign 注解和JAX-RS注解。Feign支持可插拔的編碼器和解碼器。Feign默認集成了Ribbon,默認實現了負載均衡的效果并且springcloud為feign添加了springmvc注解的支持。

思考:使用RestTemplate+ribbon已經可以完成服務間的調用,為什么還要使用feign?
存在問題如下:

  • 1.每次調用服務都需要寫這些代碼,存在大量的代碼冗余
  • 2.服務地址如果修改,維護成本增高
  • 3.使用時不夠靈活

解決了服務調用寫了一大串url解決了服務調用寫了一大串url

二、使用步驟

  • 服務調用方法引入依賴OpenFeign依賴
  • <!--Open Feign依賴--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
  • 客戶端入口類加入注解開啟OpenFeign支持和服務發現支持
  • @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class Users9099Application {public static void main(String[] args) {SpringApplication.run(Users9099Application.class, args);} }
  • 創建一個客戶端調用接口
  • //調用商品服務feign的接口 @FeignClient("products") public interface ProductClient {@GetMapping("/product/find")Map<String,Object> find(@RequestParam("id") String id); }
    • FeignClient注解的一些屬性

    重點看一下value和name:vaule和name 其實是一個屬性
    關于調用目前有兩種:

    • 接口提供方在注冊中心。
      如果服務提供方已經注冊到注冊中心了,那么name或者value的值為:服務提供方的服務名稱。
      必須為所有客戶端指定一個name或者value@FeignClient(value=“run-product”,fallback ProductClientServiceFallBack.class)
    • 單獨的一個http接口,接口提供方沒有注冊到注冊中心。
      @FeignClient(name=“runClient11111”,url=“localhost:8001”)。 此處name的值為:調用客戶端的名稱。

    以上兩種方式都能正常調用。name可以為注冊中心的實例名稱,加上url屬性時,name的值就與注冊中心實例名稱無關

  • 客戶端調用OpenFeign方法
  • @RestController @Slf4j public class UserController {@Autowiredprivate ProductClient productClient;@GetMapping("/user/getProductInfo")public Map<String,Object> getProductInfo(String productId){Map<String, Object> map = productClient.find(productId);log.info("返回的信息:[{}]"+map);return map;}
  • 服務端入口類加入注解開啟服務發現支持
  • @SpringBootApplication @EnableDiscoveryClient public class Products9098Application {public static void main(String[] args) {SpringApplication.run(Products9098Application.class, args);} }
  • 創建服務端被調用方法
  • @RestController @Slf4j public class ProductController {@Value("${server.port}")private int port;@GetMapping("/product/find")public Map<String,Object> find(@RequestParam("id") String id){Map<String, Object> map = new HashMap<>();log.info("進入商品服務,當前接收的商品id為:[{}]",id);map.put("status",true);map.put("msg","當前商品服務調用成功,查詢商品id為:"+id+",當前處理服務的端口號為: "+port);return map;} }
  • 客戶端配置文件
  • server.port=9099 #指定當前服務端口 spring.application.name=users #指定服務名稱 spring.cloud.nacos.server-addr=xxx.xxx.xxx.xxx:8848 #指定nacos服務地址 spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr} #指定注冊中心地址 management.endpoints.web.exposure.include=* #暴露所有web端點
  • 服務端配置文件
  • server.port=9098 spring.application.name=products spring.cloud.nacos.server-addr=xxx.xxx.xxx.xxx:8848 spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr} management.endpoints.web.exposure.include=*

    兩個服務啟動后,在nacos的控制臺可以看到以下兩個服務:

    訪問本地鏈接:http://localhost:9099/user/getProductInfo?productId=1
    可以看到以下:

    需要注意的是,OpenFeign默認實現負載均衡策略,如果products服務有多個實例,那么調用的時候會輪詢。

    一張圖助記:

    三、OpenFeign調用遠程服務(非本機微服務)

    //如果同時指定value和url屬性,則以url屬性為準,value屬性指定的值便當做客戶端的名稱 @FeignClient(value = "productFeign",url = "遠程ip:遠程服務端口",fallback = ProductFeignHandler.class) public interface ProductFeign {@GetMapping("/product/find")Map<String,Object> find(@RequestParam("id") String id); }

    四、Feign原理簡述

    • 啟動時,程序會進行包掃描,掃描所有包下所有@FeignClient注解的類,并將這些類注入到spring的IOC容器中。當定義的Feign中的接口被調用時,通過JDK的動態代理來生成RequestTemplate。
    • RequestTemplate中包含請求的所有信息,如請求參數,請求URL等。
    • RequestTemplate聲場Request,然后將Request交給client處理,這個client默認是JDK的HTTPUrlConnection,也可以是OKhttp、Apache的HTTPClient等。
    • 最后client封裝成LoadBaLanceClient,結合ribbon負載均衡地發起調用。

    參考文章
    參考文章

    總結

    以上是生活随笔為你收集整理的OpenFeign组件的使用(使用nacos作为服务注册中心)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。