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

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

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

      springboot~feign模擬multipart/form-data

      openfeign介紹

      在微服務設計里,服務之間的調用是很正常的,通常我們使用httpClient來實現對遠程資源的調用,而這種方法需要知識服務的地址,業務接口地址等,而且需要等他開發完成后你才可以去調用它,這對于集成開發來說,不是什么好事 ,產生了A業務與B業務的強依賴性,那么我們如何進行解耦呢,答案就是openfeign框架,它與是springcloudy里的一部分。

          springcloud的服務消費者指的就是服務間的調用,實現的方式有兩種:一種就是上一章講的restTemplate+ribbon,另一種就是本章要講的feign,feign默認集成了ribbon,所以feign也默認實現了負載均衡。

      服務發現/注冊里的服務名

      通過服務名來進行請求的發送要比配置域名發http更直觀,并且你不需要知道它的域名和端口,這也是各個微服務之前直觀調用的一種方式,而且A服務可以不依賴于B服務,只要知道接口簽名即可。

      graph TD
      B(服務b)-->C(eureka注冊中心)
      D-->|在服務a中建立client服務名為服務b|E(openfeign服務端)
      A(服務a)-->|配置某個服務中心的服務名稱|D(調用服務b的某個接口)
      D-->C
      

      添加包引用

      'org.springframework.cloud:spring-cloud-starter-openfeign'
      

      添加配置bootstrap.yml

      feign:
        client:
          config:
            default:
              connectTimeout: 2000
              readTimeout: 10000
      

      2 定義profile相關配置

      //默認的一些文件路徑的配置
      sourceSets {
          integTest {
              java.srcDir file('src/test/java')
              resources.srcDir file('src/test/resources')
          }
      }
      
      task integTest(type: Test) {
          testClassesDirs = sourceSets.test.output.classesDirs
          classpath = sourceSets.test.runtimeClasspath
      }
      

      定義服務接口

      定義偽方法,就是服務里的方法,你要知識方法參數和它的返回值,實現不用管,只在單元測試里MOCK就可以.

      package test.lind.javaLindDay.feignClientDemo;
      
      import org.springframework.cloud.openfeign.FeignClient;
      import org.springframework.context.annotation.Profile;
      import org.springframework.web.bind.annotation.GetMapping;
      
      /**
       * 模擬其他服務.
       */
      @Profile("!integTest")
      @FeignClient(name = "serviceName",primary=false)
      public interface MockClient {
        @GetMapping(path = "/balanceSheet/{clientCode}")
        String balanceSheet(String clientCode);
      }
      

      Profile的作用

      profile就是環境變量,你在類上通過ActiveProfile去激活它,在使用它時,有過Profile注解來使用上,上面代碼中MockClient對象不能在integTest環境下使用。

      添加MOCK實現,它是自動注入的,所以聲明@Bean注解

      它是為了在單元測試環境下使用client,而又不希望與外部 網絡資源通訊,所以需要mock一下本地資源去實現client.

      package test.lind.javaLindDay;
      
      import static org.mockito.ArgumentMatchers.anyString;
      import static org.mockito.Mockito.mock;
      import static org.mockito.Mockito.when;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.context.annotation.Profile;
      import test.lind.javaLindDay.feignClientDemo.MockClient;
      
      @Configuration
      @Profile("integTest")
      public class MockClientTest {
        @Bean
        @Primary
        public MockClient mockClient() {
          MockClient client = mock(MockClient.class);
          when(client.balanceSheet(
              anyString()))
              .thenReturn("OK");
          return client;
        }
      }
      

      添加單元測試,注意在單元測試上一定要指定它的環境變量

      package test.lind.javaLindDay;
      
      import static org.junit.Assert.assertEquals;
      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.boot.test.context.SpringBootTest;
      import org.springframework.test.context.ActiveProfiles;
      import org.springframework.test.context.junit4.SpringRunner;
      import test.lind.javaLindDay.feignClientDemo.MockClient;
      
      @RunWith(SpringRunner.class)
      @SpringBootTest
      //指定profile環境
      @ActiveProfiles("integTest")
      public class JavaLindDayApplicationTests {
      
        @Autowired
        MockClient mockClient;
      
        @Test
        public void testMockClient() {
          assertEquals(mockClient.balanceSheet("OK"), "OK");
        }
      }
      

      運行測試后,MockClient將會被注入,它將使用Mock實現類,因為只有Mock實現類的Profile是指向integtest環境的。
      有了openfeign,以后開發服務對服務調用就可以解耦了!

      feignClient發送multipart/form-data請求

      1. 需要先安裝插件,默認是不能發送文件流的
      <dependencies>
          ...
          <dependency>
              <groupId>io.github.openfeign.form</groupId>
              <artifactId>feign-form</artifactId>
              <version>3.3.0</version>
          </dependency>
          <dependency>
              <groupId>io.github.openfeign.form</groupId>
              <artifactId>feign-form-spring</artifactId>
              <version>3.3.0</version>
          </dependency>
          ...
      </dependencies>
      
      1. 添加bean
      @FeignClient(name = "file-upload-service", configuration = FileUploadServiceClient.MultipartSupportConfig.class)
      public interface FileUploadServiceClient extends IFileUploadServiceClient {
      
          public class MultipartSupportConfig {
      
              @Autowired
              private ObjectFactory<HttpMessageConverters> messageConverters;
      
              @Bean
              public Encoder feignFormEncoder() {
                  return new SpringFormEncoder(new SpringEncoder(messageConverters));
              }
          }
      }
      

      如果不需要Spring標準的編碼,也可以這樣實現

      @FeignClient(name = "file-upload-service", configuration = FileUploadServiceClient.MultipartSupportConfig.class)
      public interface FileUploadServiceClient extends IFileUploadServiceClient {
      
          public class MultipartSupportConfig {
      
              @Bean
              public Encoder feignFormEncoder() {
                  return new SpringFormEncoder();
              }
          }
      }
      
      1. 添加注解
          // File parameter
          @RequestLine("POST /send_photo")
          @Headers("Content-Type: multipart/form-data")
          void sendPhoto (@Param("is_public") Boolean isPublic, @Param("photo") File photo);
      
          // byte[] parameter
          @RequestLine("POST /send_photo")
          @Headers("Content-Type: multipart/form-data")
          void sendPhoto (@Param("is_public") Boolean isPublic, @Param("photo") byte[] photo);
      
          // FormData parameter
          @RequestLine("POST /send_photo")
          @Headers("Content-Type: multipart/form-data")
          void sendPhoto (@Param("is_public") Boolean isPublic, @Param("photo") FormData photo);
      
      posted @ 2020-12-29 17:17  張占嶺  閱讀(5365)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 长腿校花无力呻吟娇喘| 国产一区一一区高清不卡| 中文字幕日韩熟女av| 墨竹工卡县| 亚欧洲乱码视频在线专区| 亚洲夂夂婷婷色拍ww47| 日本丰满老妇bbb| 亚洲国产午夜精品福利| 乱女乱妇熟女熟妇综合网| 高潮迭起av乳颜射后入| 国产爽视频一区二区三区| 成人免费无码视频在线网站| 国产精品美女久久久久久麻豆| 成人精品区| 在线观看亚洲精品国产| 公天天吃我奶躁我的在线观看| 亚洲一区二区色情苍井空| 18禁网站免费无遮挡无码中文| 精品乱码一区二区三四五区| 亚洲一品道一区二区三区| 天堂久久久久VA久久久久| 成人免费看片又大又黄| 精品亚洲一区二区三区在线观看| 国产高清自产拍av在线| 性XXXX视频播放免费直播| 日韩亚洲精品国产第二页| 亚洲精品国模一区二区| 色欲久久久天天天综合网精品 | 一本色道国产在线观看二区| 国产精品视频中文字幕| 狠狠躁夜夜躁人人爽天天5 | 成a人片亚洲日本久久| 亚洲精品tv久久久久久久久久| 日韩精品一区二区三免费| 久久99精品久久久久久青青| 国产啪视频免费观看视频| 亚洲av二区国产精品| 国产99久60在线视频 | 传媒| 无码少妇一区二区| 亚洲欧美综合中文| 男女性高爱潮免费网站|