<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      day02

      使用OpenFeign依賴

      openfeign用于遠程服務調用,通常與負載均衡插件loadbalancer一起使用

      連接池

      Feign底層發起http請求,依賴于其它的框架。其底層支持的http客戶端實現包括:

      • HttpURLConnection:默認實現,不支持連接池
      • Apache HttpClient :支持連接池
      • OKHttp:支持連接池

      通常使用帶連接池的客戶端來替代默認的客戶端

      OKHttp為例:

      1. 引入pom依賴
      <!--OK http 的依賴 -->
      <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-okhttp</artifactId>
      </dependency>
      
      1. 在yaml文件配置開啟連接池,默認關閉
      feign:
        okhttp:
          enabled: true # 開啟OKHttp功能
      
      1. 重啟服務,連接池生效

      配置openfeign的日志輸出

      OpenFeign只會在FeignClient所在包的日志級別為DEBUG時,才會輸出日志。而且其日志級別有4級:

      • NONE:不記錄任何日志信息,這是默認值。
      • BASIC:僅記錄請求的方法,URL以及響應狀態碼和執行時間
      • HEADERS:在BASIC的基礎上,額外記錄了請求和響應的頭信息
      • FULL:記錄所有請求和響應的明細,包括頭信息、請求體、元數據。

      Feign默認的日志級別就是NONE,所以默認我們看不到請求日志。

      1. 定義日志級別

      新建一個配置類,添加@Bean方法,返回值為openfeign日志級別的枚舉變量

      package com.hmall.api.config;
      
      import feign.Logger;
      import org.springframework.context.annotation.Bean;
      
      public class DefaultFeignConfig {
          @Bean
          public Logger.Level feignLogLevel(){
              return Logger.Level.BASIC;
          }
      }
      
      
      1. 配置日志生效

      有兩種方式:

      • 局部生效:在某個FeignClient中配置,只對當前FeignClient生效
      @FeignClient(value = "item-service", configuration = DefaultFeignConfig.class)
      
      • 全局生效:在@EnableFeignClients中配置,針對所有FeignClient生效。
      @EnableFeignClients(basePackages = "com.hmall.api.client", defaultConfiguration = DefaultFeignConfig.class)
      

      網關

      利用網關,可以用于用戶請求的轉發和負載均衡,比如用戶所有請求均通過8080發出,經過網關路由轉發到對應的微服務的對應節點

      創建一個網關分為以下步驟:

      • 創建網關微服務
      • 引入SpringCloudGateway、NacosDiscovery依賴
      • 編寫啟動類
      • 配置網關路由

      創建網關

      1. 創建網關微服務模塊

      2. 引入SpringCloudGateway、NacosDiscovery依賴

      <dependencies>
      	<!--網關-->
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-gateway</artifactId>
          </dependency>
          <!--nacos discovery-->
          <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
          </dependency>
          <!--負載均衡-->
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-loadbalancer</artifactId>
          </dependency>
      </dependencies>
      
      1. 創建啟動類
      @SpringBootApplication
      public class GatewayApplication {
          public static void main(String[] args) {
              SpringApplication.run(GatewayApplication.class);
          }
      }
      
      1. 編寫路由配置
      server:
        port: 8080
      spring:
        application:
          name: gateway-server
        cloud:
          nacos:
            server-addr: 192.168.48.100:8848
          gateway:
            routes:
              - id: item-service  # 路由名稱:item-service
                uri: lb://item-service  # 負載均衡轉發到指定服務
                predicates: # 路由斷言,配置路由-服務命中的條件
                  - Path=/items/**,/search/** # 這里通過請求路徑前綴判斷
                filters:	# 局部路由過濾器,可設置多個過濾器
                  - filter1=xxx
              - id: item-service  # 路由名稱:user-service
                uri: lb://user-service
                predicates:
                  - Path=/users/**,/addresses/**
            default-filters:	# 全局路由過濾器,與routes同級
      

      自定義過濾器

      • 網關請求處理流程
      image-20240525171019984

      網關過濾器鏈中的過濾器有兩種:

      • GatewayFilter:路由過濾器,作用范圍比較靈活,可以是任意指定的路由Route.
      • GlobalFilter:全局過濾器,作用范圍是所有路由,不可配置。
      1. 自定義GlobalFilter

      自定義GlobalFilter需要實現GlobalFilter, Ordered(用于指定過濾器優先級)接口

      @Component
      public class PrintAnyGlobalFilter implements GlobalFilter, Ordered {
          @Override
          public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
              // 編寫過濾器邏輯
          }
      
          @Override
          public int getOrder() {
              // 過濾器執行順序,值越小,優先級越高
              return 0;
          }
      }
      
      1. 傳遞信息:網關->微服務

      網關傳遞信息給微服務很簡單:

      • 在網關過濾器中將信息添加到請求頭
      //在網關過濾器中修改請求頭的方法
      ServerWebExchange newEx = exchange.mutate()
                      .request(b -> b.header("user-info", user_info))
                      .build();
      return chain.filter(newEx);
      
      • 接著在SpringMVC的攔截器中獲取信息并存入ThreadLocal中

      這里有一個可能會碰到的錯誤,如果把該攔截器配置到spring.foctories文件中實現自動裝配,那么如果網關引入了該攔截器所在的模塊,那么會導致網關缺失MVC依賴錯誤,因為攔截器是SpringMVC層的,解決方法就是使用條件裝配@ConditionalOnClass(DispatcherServlet.class),只在擁有SpringMVC的環境中裝配該Bean

      1. 傳遞信息:微服務->微服務

      微服務之間調用是基于OpenFeign來實現的,發起的也是http請求,因此也可以通過請求頭攜帶的方式來傳遞信息,openfeign提供了一個攔截器接口feign.RequestInterceptor,只需要實現該接口并實現apply方法,然后利用RequestTemplate對象來修改請求頭。這樣一來,每次OpenFeign發起請求的時候都會調用該方法,傳遞用戶信息。

      • 實現RequestInterceptor以及apply方法
          @Bean
          public RequestInterceptor userInfoRequestInterceptor(){
              return new RequestInterceptor() {
                  @Override
                  public void apply(RequestTemplate requestTemplate) {
                      Long id = UserContext.getUser();
                      if (id != null){
                          requestTemplate.header("user-info",id.toString());	//添加請求頭
                      }
                  }
              };
          }
      

      微服務消息傳遞流程:

      image-20240525215334325

      配置管理

      配置共享

      將多個微服務中共同的配置信息抽取到nacos配置文件,由nacos統一管理

      實現步驟:

      1. 添加相關依賴
              <!--nacos配置管理-->
              <dependency>
                  <groupId>com.alibaba.cloud</groupId>
                  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
              </dependency>
              <!--讀取bootstrap文件-->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-bootstrap</artifactId>
              </dependency>
      
      1. 抽取微服務中共同的配置信息到nacos中
      image-20240526180555489
      1. 添加bootstrap.yaml文件

      由于讀取Nacos配置是SpringCloud上下文(ApplicationContext)初始化時處理的,發生在項目的引導階段。然后才會初始化SpringBoot上下文,去讀取application.yaml,所以目前無法讀取到nacos地址,也就不能拉去配置信息。但springcloud上下文在初始化時會讀取一個bootstrap.yaml文件,可以在其中配置nacos的信息

      • 添加bootstrap.yaml文件
      • 編寫配置信息
      spring:
        application:
          name: cart-service
        profiles:
          active: dev
        cloud:
          nacos:
            server-addr: 192.168.48.100:8848
            config:
              file-extension: yaml
              shared-configs:
                - dataId: shared-jdbc.yaml
                - dataId: shared-log.yaml
                - dataId: shared-swagger.yaml
      
      1. 修改application.yaml配置內容,添加相關配置鍵值對,刪除重復配置

      配置熱啟動

      nacos支持配置熱啟動,可無需重啟便能修改配置信息

      1. 在nacos中添加配置文件(命名格式有限制),編寫配置信息
      dataId: [微服務名]-[spring.active.profile].[后綴名]
      //配置文件內容
      hm:
        cart:
          maxAmount: 1 # 購物車商品數量上限
      
      1. 在微服務中使用@ConfigurationProperties注解讀取配置信息

      Nacos動態路由

      Nacos可以配置動態路由,將路由信息保存在nacos配置管理中,動態的添加/刪除路由信息,不用重啟路由服務

      使用的依賴:

      <!--統一配置管理-->
      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
      </dependency>
      <!--加載bootstrap-->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-bootstrap</artifactId>
      </dependency>
      

      通過注入RouteDefinitionWriter(用于更新內存中的路由配置信息)和NacosConfigManager(用于拉取nacos路由配置信息和監聽配置信息變化)的bean對象

      • 拉取并監聽nacos路由配置信息
      String configInfo = nacosConfigManager.getConfigService()
                      .getConfigAndSignListener(dataId, group, 5000, new Listener() {
                          @Override
                          public Executor getExecutor() {
                              return null;
                          }
      
                          @Override
                          public void receiveConfigInfo(String configInfo) {
                              updateConfigInfo(configInfo);
                          }
                      });
      
      • 更新內存路由配置
      writer.delete(Mono.just(routeId)).subscribe();	//routeId為String類型
      writer.save(Mono.just(routeDefinition)).subscribe();
      
      posted @ 2024-07-25 15:42  Arthur-Morgan  閱讀(30)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 粉嫩国产av一区二区三区| 精品视频在线观看免费观看| 色吊丝av熟女中文字幕| 国产精品无码午夜福利| 欧美视频精品免费覌看| 国产一区二区三区尤物视频| 98久久人妻少妇激情啪啪| 欧美大胆老熟妇乱子伦视频| 亚洲AV日韩AV综合在线观看| 亚洲av在线观看| 2021亚洲爆乳无码专区| 日韩熟女精品一区二区三区| 国产精品会所一区二区三区 | 日本一区二区三区免费播放视频站| 精品人妻av中文字幕乱| 99国产精品一区二区蜜臀| 粉嫩一区二区三区精品视频| 男女男免费视频网站国产| 日本伊人色综合网| 国产av一区二区久久蜜臀| 成全高清在线播放电视剧 | 日韩欧激情一区二区三区| 久久精品亚洲日本波多野结衣| 国产久免费热视频在线观看| 国产激情一区二区三区不卡| 日韩精品区一区二区三vr| 免费人成在线观看网站| 在线看国产精品自拍内射| 老熟女熟妇一区二区三区| 中文字幕人成无码免费视频| 亚洲一区二区三区影院| 午夜免费视频国产在线| 免费无码一区无码东京热| 国产精品欧美一区二区三区不卡| 蜜桃无码一区二区三区| 亚洲中文字幕精品久久| 闸北区| 欧美日韩国产综合草草| 日韩人妻精品中文字幕| 国产成人精品中文字幕| av激情亚洲男人的天堂|