怎么在一个微服务中调用另一个微服务
开发原则:一个微服务最好对应一个数据库schema,如果需要参数需要其它schema表中参数,调用对应schema其对应微服务所暴露出来的api。(*****)
下面将具体介绍怎么在一个微服务中调用另一个微服务(注册中心使用的是eurake)
1.先创建一个外部微服务的包,在包下创建对应微服务的Clients和Client对象,注意不要直接使用client对象,要用clients对象get。
下面是实例代码:(因为项目中用到了Oauth2,所以clients会多出一点)
@Component
@Import(FeignClientsConfiguration.class)
public class xxxClients {
private xxxClient userClient;
private xxxClient client;
@Autowired
public xxxClients(
Decoder decoder, Encoder encoder, Client client, Contract contract,
LoadBalancedResourceDetails loadBalancedResourceDetails,
RequestInterceptor oauth2RequestInterceptor,
RequestInterceptor userFeignClientInterceptor
) {
this.client = Feign.builder().client(client)
.encoder(encoder)
.decoder(decoder)
.contract(contract)
.requestInterceptor(oauth2RequestInterceptor)
.target(xxxClient.class, "http://xxx");
this.userClient = Feign.builder().client(client)
.encoder(encoder)
.decoder(decoder)
.contract(contract)
.requestInterceptor(userFeignClientInterceptor)
.target(xxxClient.class, "http://xxx");//这里填写微服务在eurake中注册的名称
}
public xxxClient getUserClient() {
return userClient;
}
public xxxClient getClient() {
return client;
}
}
@FeignClient(name="被调用微服务的名称");下面是具体的api及访问路径
2.LoadBalancedResourceDetails(Clients中引入的一个类,没有加导包) :
@ConditionalOnMissingBean
public class LoadBalancedResourceDetails extends ClientCredentialsResourceDetails {Logger log = LoggerFactory.getLogger(LoadBalancedResourceDetails.class);
private String tokenServiceId;
private LoadBalancerClient loadBalancerClient;
public LoadBalancedResourceDetails(LoadBalancerClient loadBalancerClient) {
this.loadBalancerClient = loadBalancerClient;
}
@Override
public String getAccessTokenUri() {
if (loadBalancerClient != null && tokenServiceId != null && !tokenServiceId.isEmpty()) {
try {
return loadBalancerClient.reconstructURI(
loadBalancerClient.choose(tokenServiceId),
new URI(super.getAccessTokenUri())
).toString();
} catch (URISyntaxException e) {
log.error("{}: {}", e.getClass().toString(), e.getMessage());
return super.getAccessTokenUri();
}
} else {
return super.getAccessTokenUri();
}
}
public String getTokenServiceId() {
return this.tokenServiceId;
}
public void setTokenServiceId(String tokenServiceId) {
this.tokenServiceId = tokenServiceId;
}
}
3.根据业务调用其它微服务的api
- Python怎么在一个文件中的类调用另一个文件中的类
- 一个对象怎么调用另一个对象, 打jar包,到底调用哪一个方法, 匿名对象, 空对象
- j2me怎么用一个主类调用另一个主类呀
- Java学习----一个对象怎么调用另一个对象呢?
- 同一个解决方案中,一个项目怎么都调用不了另一个类库中的类
- Java练笔:一个类作为另一个类的参数调用。顺带训练数据在栈和堆的走向。思考若用C++写,delete应该怎么写
- Java中的一个类怎么调用另一个类中的方法?
- 初学C#,请问怎么在一个窗体中调用另一个窗体?
- C#在一个解决方案下怎么在一个窗体中调用另一个窗体中的方法
- 同一个解决方案中,一个项目怎么都调用不了另一个类库中的类(已解决)
- iOS 如何在一个app中调用另一个app
- 从webconfig中动态调用web服务,找到的一个简单方法!!!!
- 17 驱动模块的符号导出(一个驱动模块调用另一个驱动模块)
- android调用远程service(一个apk调用另一个apk的service)
- react实现两个方法同时执行时,其中一个能够调用另一个的执行结果
- 能否在一个构造器中调用另一个构造器
- 一个通过JSONP跨域调用WCF REST服务的例子(以jQuery为例)
- 调用webservices服务一个异常处理:org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in someth
- oracle 在一个存储过程中调用另一个返回游标的存储过程
- Android 一个Activity调用另一个Activity中的公有方法