免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

      「Feign」OpenFeign入門以及遠程調用

      一、OpenFeign介紹

      OpenFeign是 種聲明式,模版化的HTTP客戶端。使 OpenFeign進 遠程調 時,開發(fā)者完全感知不到這是在進 遠程調 , 是像在調 本地 法 樣。使 式是注解+接 形式,把需要調 的遠程接 封裝到接 當中,映射地址為遠程接 的地址。在啟動SpringCloud應 時,Feign會掃描標有@FeignClient注解的接 , 成代理并且注冊到Spring容器當中。 成代理時Feign會為每個接 法創(chuàng)建 個RequestTemplate對象,該對象封裝HTTP請求需要的全部信息,請求參數名、請求 法等信息都是在這個過程中確定的,模版化就體現在這 。

      二、OpenFeign的使用

      • 搭建前置環(huán)境,在pom.xml文件中引入依賴,可以選擇使用注冊中心或者配置中心

      org.springframework.cloud spring-cloud-dependencies 2020.0.3 pom import org.springframework.cloud spring-cloud-starter-consul-config org.springframework.cloud spring-cloud-starter-consul-discovery org.springframework.boot spring-boot-starter-actuator org.springframework.cloud spring-cloud-starter-openfeign

      1.使用注冊中心

      • 使 注冊中 ,將服務注冊到consul(nacos),調 者拿到被調 服務的地址端 進 調

      spring.cloud.consul.host=192.168.0.124#consul地址spring.cloud.consul.port=8080#端 號spring.cloud.consul.discovery.service-name=service-test-01#服務名稱spring.cloud.consul.discovery.health-check-interval=1m#健康檢查間隔時間server.port=10000#服務端 號

      • 在配置類上開啟服務發(fā)現以及允許遠程調

      @EnableDiscoveryClient //開啟服務發(fā)現@EnableFeignClients //開啟服務調 ,只需要在調 開啟即可

      • 服務運 之后可以在consul的UI界 看到運 的服務,consul會定時檢查服務的健康狀態(tài)
      • 創(chuàng)建遠程調用接口

      @FeignClient(“serviceName”)public interface Service2Remote { /** 這 有 定義解碼器對遠程調 的結果進 解析,拿到真正的返回類型,所以接 返回值類型和遠程接 返回類型保持 致 **/ @PostMapping(“/page”) List pageQuestion(PageQuestionReq req);}

      • 簡單使用

      @RestController@RequestMapping(“/service/remote”)public class RemoteController { @Autowired private Service2Remote service2Remote; @PostMapping(“/getQuestionList”) public List getQuestionList(@RequestBody PageQuestionReq req){ List result = service2Remote.pageQuestion(req); //對拿到的數據進 處理… return result; }}

      2.使用配置中心

      • 將請求的URL寫在配置中 進 讀取修改配置 件

      spring.cloud.consul.config.format=KEY_VALUE#consul 持yaml格式和Key-value形式spring.cloud.consul.config.enabled=true#開啟配置spring.cloud.consul.config.prefixes=glab/plat/wt/application/test#consul配置存放的外層 件夾 錄spring.cloud.consul.config.default-context=config# 級 件夾spring.cloud.consul.config.watch.delay=1000#輪詢時間spring.cloud.consul.discovery.enabled=false#關閉注冊remote.url=www.baidu.com#請求地址

      • 創(chuàng)建遠程調用接口

      @FeignClient(name = “service2RemoteByUrl”,url = “${remote.url}”) //name需要配置,URL從配置中 讀取public interface Service2RemoteByUrl { @PostMapping(“/page”) List pageQuestion(PageQuestionReq req);}

      3.自定義解碼器(編碼器

      // 定義解碼器實現Decoder接 ,重寫decode 法即可,根據具體需求進 編寫//如果是 定義編碼器,需要實現Encoder接 ,重寫encode 法public class FeignDecoder implements Decoder { @Override public Object decode(Response response, Type type) throws IOException,DecodeException, FeignException { if (response.body() == null){ throw new DecodeException(ErrorEnum.EXECUTE_ERR.getErrno(),”沒有獲取到有效結果值”,response.request()); } // 拿到值 String result = Util.toString(response.body().asReader(Util.UTF_8)); Map resMap = null; try { resMap = JSON.parseObject(result, Map.class); } catch (Exception e) { //返回結果是字符串 return result; }}

      4.遠程調用攜帶Cookie

      • 由于feign調 是新創(chuàng)建 個Request,因此在請求時不會攜帶 些原本就有的信息,例如Cookie,因此需要 定義RequestInterceptor對Request進 額外設置, 般情況下,寫 Cookie是 較常 的做法,如下設置

      @Configurationpublic class BeanConfig { @Bean public RequestInterceptor requestInterceptor(){ return template -> { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //此處可以根據業(yè)務 具體定制攜帶規(guī)則 String data = request.getParameter(“data”); String code = null; try { //這 需要轉碼,否則會報錯 code = URLEncoder.encode(data, “UTF-8”); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } template.query(“data”,code); //請求頭中攜帶Cookie String cookie = request.getHeader(“Cookie”); template.header(“Cookie”,cookie); }; } @Bean public Decoder decoder(){ return new FeignDecoder(); }}

      三、調用流程解析

      //在使 EnableFeignClients開啟feign功能時,點擊進 會看到該注解是通過ImportFeignClientsRegistrar類 效的,其中有個 法//registerBeanDefinitions執(zhí) 兩條語句registerDefaultConfiguration(metadata, registry); //加載默認配置信息registerFeignClients(metadata, registry); //注冊掃描標有FeignClient的接 //關注registerFeignClients 法for (String basePackage : basePackages) { candidateComponents.addAll(scanner.findCandidateComponents(basePackage)); //在basePackage路徑下掃描并添加標有FeignClient的接 }for (BeanDefinition candidateComponent : candidateComponents) { //遍歷 if (candidateComponent instanceof AnnotatedBeanDefinition) { registerClientConfiguration(registry, name, attributes.get(“configuration”)); // registerFeignClient(registry, annotationMetadata, attributes); //注冊到Spring容器當中, 法詳細在FeignClientsRegistrar類當中 }}//在對feign調 時進 斷點調試//在 成Feign遠程接 的代理類時,調 處理器是Feign提供的FeignInvocationHandlerpublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (“equals”.equals(method.getName())) { //equals,hashCode,toString三個 法直接本地執(zhí) } else if (“hashCode”.equals(method.getName())) { return hashCode(); } else if (“toString”.equals(method.getName())) { return toString(); } //執(zhí) 法對應的 法處理器MethodHandler,這個接 是Feign提供的,與InvocationHandler 任何關系,只有 個invoke 法 return dispatch.get(method).invoke(args);}//點進上 的invoke 法public Object invoke(Object[] argv) throws Throwable { //創(chuàng)建 個request模版 RequestTemplate template = buildTemplateFromArgs.create(argv); while (true) { try { return executeAndDecode(template, options); //創(chuàng)建request執(zhí) 并且解碼 } }}Object executeAndDecode(RequestTemplate template, Options options) throws Throwable { Request request = targetRequest(template); //創(chuàng)建Request并增強 Response response = client.execute(request, options); //執(zhí) 調用請求,不再繼續(xù)分析了 response = response.toBuilder().request(request).requestTemplate(template).build(); //如果有重寫解碼器,使 定義的解碼器,feign默認使 SpringEncoder if (decoder != null) return decoder.decode(response, metadata.returnType()); } Request targetRequest(RequestTemplate template) { //如果 定義了RequestInterceptor,在這 可以對Request進 增強 for (RequestInterceptor interceptor : requestInterceptors) { //執(zhí) 定義的apply 法 interceptor.apply(template); } //創(chuàng)建Request return target.apply(template);}

      四、補充

      • 關于Client接 的實現類,使 注冊中 和使 配置中 其流程稍有區(qū)別

      //使 配置中 拿url 式進 調 ,使 的是Client的默認內部實現類 Default ,其中Default使 的是HttpURLConnection進 Http請求的HttpURLConnection connection = convertAndSend(request, options);//如果使 的是服務發(fā)現,使 的使 Client的實現類FeignBlockingLoadBalancerClient,它會去根據配置的服務名去注冊中 查找服務的IP地址和端 號,執(zhí) 使 的仍然是默認實現類Default,通過HttpURLConnection請求//FeignBlockingLoadBalancerClient,根據服務名稱查找服務IP地址、端 88 ServiceInstance instance = loadBalancerClient.choose(serviceId, lbRequest);//具體實現 法,BlockingLoadBalancerClient類中 145 Response loadBalancerResponse = Mono.from(loadBalancer.choose(request)).block();//還有其他實現Client接 的客戶端,例如ApacheHttpClient,ApacheHttpClient帶有連接池功能,具有優(yōu)秀的HTTP連接復 能 ,需要通過引 依賴來使

      鄭重聲明:本文內容及圖片均整理自互聯網,不代表本站立場,版權歸原作者所有,如有侵權請聯系管理員(admin#wlmqw.com)刪除。
      用戶投稿
      上一篇 2022年6月13日 21:14
      下一篇 2022年6月13日 21:14

      相關推薦

      • 計算機網絡技術論文(計算機網絡技術論文七千字)

        今天小編給各位分享計算機網絡技術論文的知識,其中也會對計算機網絡技術論文七千字進行解釋,如果能碰巧解決你現在面臨的問題,別忘了關注本站,現在開始吧! 計算機網絡方面的論文3000字…

        2022年11月26日
      • 抖音帶貨怎么做入門(抖音帶貨怎么做入門教學)

        相信很多小伙伴都有注意到,現在抖音已經成為大家最常光顧的一個平臺了,作為一個日活破億的流量池,如今抖音上的用戶數量極大。因此,現在在抖音上帶貨、賣貨的人也是越來越多了,那么想在抖音…

        2022年11月25日
      • 沈陽茂業(yè)中心

        由深圳贏商網茂業(yè)集團與上海建工集團聯袂打造的沈陽金廊第一高樓沈陽茂業(yè)中心于2011年11月8日順利實現主塔樓結構封頂至此,歷經四年,沈陽茂業(yè)中心以31095m的高度雄踞東北超高層建…

        2022年11月25日
      • 前三季度,市場規(guī)模超過五萬億元 信息消費展現蓬勃生機

        家居企業(yè)個性化全屋定制系統(tǒng),備受消費者青睞;主打專業(yè)電競的新款高性能便攜式計算機,銷量表現創(chuàng)新高;物流企業(yè)推出數智化供應鏈興農服務項目,助力優(yōu)質農產品出深山…… 不久前,工信部發(fā)布…

        2022年11月24日
      • 1千克等于多少磅

        克,此定義在1958年被美國以及其他英聯邦會員國承認換算回來,一千克等于262磅,一磅等于037千克英國在1963年開始,依據度量衡法案的規(guī);1 磅=16 盎司=04536 千克 …

        2022年11月24日
      • 廣州花都嶺南批發(fā)地女裝在哪拿貨好(廣州花都嶺南批發(fā)地女裝)

        廣州的服裝批發(fā)市場人氣一直也都挺高的,不過很多商家第一次來廣州進貨,對于一些女裝貨源批發(fā)還不是很了解。廣州花都嶺南批發(fā)地女裝在哪拿貨好?現在廣州服裝貨源批發(fā)哪里最便宜呢?今天小編整…

        2022年11月23日
      • 微信健康碼怎么注銷重新申請健康碼 怎么更換綁定人

        在疫情常態(tài)化的管理之下,出行都需要健康碼,那么如果因為種種原因注銷了健康碼怎么辦呢?這種情況下是否還可以再申請健康碼呢?下面一起來看看了解一下吧! 微信健康碼注銷了還能申請嗎 健康…

        2022年11月22日
      • 拼多多免費領商品有什么規(guī)則(拼多多免費領商品金幣后面是什么)

        拼多多免費領商品活動相信不少小伙伴都參加過,吸引力還是很大的,只要砍價成功就可以免費領到商品,一些小伙伴第一次參加不知道拼多多免費領商品有什么規(guī)則?下面小編為大家?guī)砥炊喽嗝赓M領商…

        2022年11月21日
      • 個人核心能力有哪些一個人想要成長,需要具備這5項核心能力

        能力。Enjoy~ 01 培養(yǎng)成長型心態(tài) 斯坦福大學心理學教授卡羅爾·德維克在做“如何應對失敗”的研究時,曾做過一個試驗:她給一群小學生一些特別難的字謎,然后觀察他們的反應。 她發(fā)…

        2022年11月20日
      • 京東店鋪類型有哪些京東入駐有什么資質要求

        今天的互聯網發(fā)展迅速,讓傳統(tǒng)企業(yè)有了更多選擇,但也同樣也對剛觸網的商家增添了許多迷茫,近日知舟電商就收到很多商家朋友詢問京東入駐相關問題,今天知舟君就給大家分享下。 一.京東入駐準…

        2022年11月18日

      聯系我們

      聯系郵箱:admin#wlmqw.com
      工作時間:周一至周五,10:30-18:30,節(jié)假日休息