spring boot openfeign从此和httpClient说再见详析
前言
在微服务设计里,服务之间的调用是很正常的,通常我们使用httpClient来实现对远程资源的调用,而这种方法需要知识服务的地址,业务接口地址等,而且需要等他开发完成后你才可以去调用它,这对于集成开发来说,不是什么好事,产生了A业务与B业务的强依赖性,那么我们如何进行解耦呢,答案就是openfeign框架,它与是springcloudy里的一部分。
1添加包引用
'org.springframework.cloud:spring-cloud-starter-openfeign',
注意:如果你没有引用springcloudy版本人有太多,需要先声明它
dependencyManagement{
imports{
mavenBom"org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
2定义profile相关配置
//默认的一些文件路径的配置
sourceSets{
integTest{
java.srcDirfile('src/test/java')
resources.srcDirfile('src/test/resources')
}
}
taskintegTest(type:Test){
testClassesDirs=sourceSets.test.output.classesDirs
classpath=sourceSets.test.runtimeClasspath
}
3定义服务接口,定义伪方法,就是服务里的方法,你要知识方法参数和它的返回值,实现不用管,只在单元测试里MOCK就可以
packagetest.lind.javaLindDay.feignClientDemo;
importorg.springframework.cloud.openfeign.FeignClient;
importorg.springframework.context.annotation.Profile;
importorg.springframework.web.bind.annotation.GetMapping;
/**
*模拟其他服务.
*/
@Profile("!integTest")
@FeignClient(name="serviceName")
publicinterfaceMockClient{
@GetMapping(path="/balanceSheet/{clientCode}")
StringbalanceSheet(StringclientCode);
}
4Profile的作用
profile就是环境变量,你在类上通过ActiveProfile去激活它,在使用它时,有过Profile注解来使用上,上面代码中MockClient对象不能在integTest环境下使用。
5添加MOCK实现,它是自动注入的,所以声明@Bean注解
packagetest.lind.javaLindDay;
importstaticorg.mockito.ArgumentMatchers.anyString;
importstaticorg.mockito.Mockito.mock;
importstaticorg.mockito.Mockito.when;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.context.annotation.Profile;
importtest.lind.javaLindDay.feignClientDemo.MockClient;
@Configuration
@Profile("integTest")
publicclassMockClientTest{
@Bean
publicMockClientmockClient(){
MockClientclient=mock(MockClient.class);
when(client.balanceSheet(
anyString()))
.thenReturn("OK");
returnclient;
}
}
6添加单元测试,注意在单元测试上一定要指定它的环境变量
packagetest.lind.javaLindDay;
importstaticorg.junit.Assert.assertEquals;
importorg.junit.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.test.context.ActiveProfiles;
importorg.springframework.test.context.junit4.SpringRunner;
importtest.lind.javaLindDay.feignClientDemo.MockClient;
@RunWith(SpringRunner.class)
@SpringBootTest
//指定profile环境
@ActiveProfiles("integTest")
publicclassJavaLindDayApplicationTests{
@Autowired
MockClientmockClient;
@Test
publicvoidtestMockClient(){
assertEquals(mockClient.balanceSheet("OK"),"OK");
}
}
运行测试后,MockClient将会被注入,它将使用Mock实现类,因为只有Mock实现类的Profile是指向integtest环境的。
有了openfeign,以后开发服务对服务调用就可以解耦了!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。