精通springcloud:微服务之间的通信,继承支持
Posted jinggege795
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精通springcloud:微服务之间的通信,继承支持相关的知识,希望对你有一定的参考价值。
继承支持
开发人员可能已经注意到,控制器实现中的注解和该控制器所服务的REST服务的Feign客户端实现是相同的。我们可以创建一个包含抽象REST方法定义的接口。该接口可以由控制器类实现,也可以由Feign客户端接口扩展。
public interface AccountService {
@PostMapping
Account add (@RequestBody Account account) ;
@PutMapping
Account update (@RequestBody Account account) ;
@PutMapping ("/withdraw/ (id}/{amount}")
Account wi thdraw (ePathVariable ("id") Long id, @PathVariable ("amount" )
int amount) ;
@GetMapping("/{id}")
Account findById (@PathVariable("id") Long id);
@GetMapping (" 1 customer/ {customerId")
List<Account> findByCustomerId (@PathVariable ("customerId") Long
customerId) ;
ePostMapping("/ids")
List<Account> find (eRequestBody List<Long> ids) ;
@DeleteMapping("/{id}")
void delete (OPathVariable("id") Long id);
}
现在,控制器类为基本接口中的所有方法提供了一一个实现,但不包含任何REST映射的注解。当然,@RestController 注解还是需要的。以下是account-service服务控制器的一个片段。
@RestController
public class AccountController implements AccountService {
@Autowi red
AccountRepository repository;
public Account add (@RequestBody Account account) {
return repository.add (account) ;
}
//...
}
用于调用account-service服务的Feign客户端接口不提供任何方法。它只是扩展了基础接口AccountService。 要查看基于接口和Feign 继承的完整实现,可以切换到以下feign_ _with _inheritance 分支。
https://github . com/piomin/ shown here- spring-cloud-comm/tree/feign with_inheritance
以下是一个带继承支持的Feign 客户端声明示例。它扩展了AccountService 接口,并处理了由@RestController公开的所有方法。
@FeignClient (name = "account-service")
public interface AccountClient extends AccountServicel
}
手动创建客户端
如果开发人员不太相信像注解这样的形式,则可以始终使用Feign Builder API手动创建Feign客户端。Feign 有若干个可以自定义的功能,如消息的编码器和解码器或HTTP客户端实现。
AccountClient accountClient = Feign. builder () .client (new OkHttpClient()) .
.encoder (new JAXBEncoder () )
. decoder (new JAXBDecoder () )
. contract (new JAXRSContract () )
. requestInterceptor (new Basi CAuthRequest Interceptor ("user",
"password"))
.target (AccountClient.class, "http://account-service");
客户端的自定义
客户端的自定义不仅可以使用Feign Builder API接口执行,还可以使用类似注解的形式来执行。例如,开发人员可以通过使用@FeignClient注解的configuration属性来设置它,以提供配置类。
@FeignClient (name - "account-service", configuration =
AccountConfiguration.class)
以下显示了一个示例配置bean。
@Configuration
public class AccountConfiguration
@Bean
public Contract feignContract() {
return new JAXRSContract() ;
@Bean
public Encoder feignEncoder(){
return new JAXBEncoder() ;
@Bean
public Decoder feignDecoder () {
return new JAXBDecoder() ;
}
@Bean
public BasicAuthRequestInterceptor basiCAuthRequestInterceptor (){
return new BasicAuthRequestInterceptor ("user", "password");
}
}
SpringCloud支持通过声明SpringBeans覆盖以下属性。
口Decoder: 默认为ResponseEntityDecoder.
口Encoder: 默认为SpringEncoder.
口Logger: 默认为SIf4jLogger.
口Contract: 默认为SpringMvcContract.
口Feign.Builder: 默认为HystrixFeign.Builder.
口Client: 如果启用了Ribbon, 则为LoadBalancerFeignClient; 否则,将使用默认的Feign客户端。
口Logger.Level: 它为Feign 设置默认日志级别。可以在NONE、BASIC、HEADERS和FULL之间选择。
口 Retryer: 它允许在通信失败的情况下实现重试算法。
口ErrorDecoder: 它允许将HTTP状态代码映射到特定于应用程序的异常。
口Request.Options:它允许为请求设置读取和连接超时。
口Collection<RequestInterceptor>: 已注册的Requestnterceptor 实现的集合,这些实现将基于从请求中获取的数据执行某些操作。
也可以使用配置属性自定义Feign客户端。例如,可以通过在feign.client.config属性前缀之后提供客户端的名称来覆盖所有可用客户端的设置,或者仅覆盖单个选定客户端的设置。如果将名称设置为default而不是特定的客户端名称,则会将其应用于所有Feign客户端。使用@EnableFeignClients 注解及其defaultConfiguration 属性时,也可以使用与前面所述类似的方式指定默认配置。pplication.yml文件中提供的设置始终具有比@Configuration bean 更高的优先级。要更改该方法,并且如果开发人员更喜欢使用@Configuration注解而不是YAML文件,则应该将feig.clint.defaultto properties属性设置为false。以下是account-service 服务的Feign客户端配置示例,它设置了连接超时、HTTP连接的读取超时和日志级别。
feign:
client:
config:
account-service:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: basic
小结
本章启动了若干个可以相互通信的微服务。我们讨论了诸如REST客户端的不同实现、多个实例之间的负载均衡以及与服务发现的集成等主题。在我们看来,这些方面非常重要,所以需要在两个章节中对它们进行更详细地说明。本章的重点是介绍微服务之间的通信,并且讨论了与微服务架构的其他重要组件的集成。第7章将演示负载均衡器和REST客户端的更高级用法,特别关注网络和通信问题。阅读完本章之后,开发人员应该能够在应用程序中正确使用Ribbon、Feign, 甚至RestTemplate,并将它们连接到其他Spring Cloud组件。在大多数情况下,有这些知识就已经足够了。但是,有时开发人员需要自定义客户端负载均衡器配置或启用更高级的通信机制,如断路器或回退逻辑。了解这些解决方案及其对系统中的服务间通信的影响非常重要。我们将在第7章讨论它们。
总结
因为文章包含的内容实在是太多了,就不给大家做过多的介绍了,需要这份文档来学习的小伙伴,可以转发此文关注小编。
扫码来获取就可以了!
以上是关于精通springcloud:微服务之间的通信,继承支持的主要内容,如果未能解决你的问题,请参考以下文章
精通springcloud:微服务之间的通信,监控延迟和容错
精通springcloud:微服务之间的通信,带Hystrix的断路器模式
你是否精通springcloud:使用SpringCloud进行同步通信?
你是否精通springcloud:使用SpringCloud进行同步通信?