你是否精通springcloud:使用SpringCloud进行同步通信?
Posted jinggege795
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你是否精通springcloud:使用SpringCloud进行同步通信?相关的知识,希望对你有一定的参考价值。
微服务之间的通信
在前两章中,我们讨论了与微服务架构一服务发现和配置服务器中非常重要的元素相关的细节。但是,值得一提的是,它们在系统中存在主要是为了帮助管理独立应用程序的整体设置。该管理的一个方面就是微服务之间的通信。在这里,服务发现扮演了一个特别重要的角色,它负责存储所有可用应用程序的网络位置并提供服务。当然,我们也可以设想一个没有服务发现服务器的系统架构,本章就将介绍这样的示例。当然,参与服务间通信的最重要组件是HTTP客户端和客户端负载均衡器。本章将重点关注它们。
本章将要讨论的主题包括:
口使用 Spring RestTemplate进行有和没有服务发现的服务间通信。
口自定义Ribbon客户端。
口Feign客户端提供的主要功能的描述,如与Ribbon客户端的集成、服务发现、继承和分区支持。
不同类型的通信
微服务之间的通信具有不同的类型。可以从两个维度来划分它们。第一个维度是将其划分为同步(Synchronous) 和异步(Asynchronous) 通信协议。异步通信的关键要点是客户端在等待响应时不应该阻塞线程。这种通信最流行的协议是AMQP,在第5章的末尾我们已经介绍了使用该协议的示例。
当然,服务之间的主要通信方式仍然是同步HTTP协议,本章将对其进行详细讨论。
第二个维度是按照存在单个消息接收器还是多个消息接收器来划分的,可以划分为“一对一”或“一对多”通信类型。在“一对一”通信中,每个请求仅由一个服务实例处理;在“一对多”通信中,每个请求可以由许多不同的服务处理。本书将在第11章“消息驱动的微服务”中对此展开详细的讨论。
使用Spring Cloud进行同步通信
Spring Cloud提供了一组组件来帮助开发人员实现微服务之间的通信。第一个组件是RestTemplate,它总是用于在客户端使用RESTful Web服务,包含在Spring Web项目中。要在微服务环境中有效地使用它,应该使用@LoadBalanced限定符(Qualifer)进行注解。由此它将自动配置为使用Netlix Ribbon,它将能够通过使用服务名称而不是IP地址来利用服务发现。Ribbon是一个客户端负载均衡器,它提供了一个简单的接口,允许控制HTTP和TCP客户端的行为。它可以轻松地与其他Spring Cloud组件集成,如服务发现或断路器。此外,它对开发人员完全透明。第二个可用组件是Feign,这是一个同样来自NetlixOss的声明性REST客户端。Feign 已经使用Ribbon进行负载均衡,并且可以从服务发现中获取数据。可以通过使用@FeignClient注解方法在界面上轻松声明它。本章将详细介绍此处列出的所有组件。
使用Ribbon执行负载均衡
与Ribbon有关的主要概念是命名客户端(Client) 。这就是为什么开发人员可以使用客户端的名称而不是带有主机名和端口的完整地址来调用其他服务,并且无须连接到服务发现。在这种情况下,应该在application.yml文件内的Ribbon配置设置中提供地址的列表。
使用Ribbon客户端启用微服务之间的通信
现在来继续这个示例。它由4个独立的微服务组成,其中一些可能会调用其他微服务公开的端点。应用程序源代码可在以下地址处获得。
https://github . com/piomin/sample- spr ing-cloud-comm.git
在这个示例中,我们将尝试开发一个简单的订单系统,客户可以在该系统中购买产品。如果客户决定确认要购买的所选产品列表,则POST请求将发送到order-service (订单服务)。它由REST控制器内的Order prepare(@RequestBody Order rdre.)方法处理。该方法负责订单的准备。首先,它将从order-service中调用适当的API 方法,考虑产品列表中每个产品的价格、客户订购的历史记录及客户在系统中的类别等因素,计算出最终价格:然后,它通过调用account-service (账户服务),验证客户的账户余额是否足够执行订单:最后,它返回计算的价格。如果客户确认操作,则调用PUT /{id}方法。该请求将由REST控制器内的Order accept(@PathVariable Long d...}方法处理。它会更改订单的状态并从客户的账户中提取资金。该系统架构可以分解为各个微服务,如图6.1所示。
静态负载均衡配置
本示例中的order-service(订单服务)必须与该示例中的所有其他微服务进行通信,以执行所需的操作,因此,开发人员需要使用ribbon.listOfServers 属性定义3个不同的Ribbon客户端,并且这些客户端需要包含网络地址设置。该示例中的第二个重要事项是在Eureka中禁用默认启用的发现服务。以下是application.yml文件中orderservice的所有己定义属性。
server:
port: 8090
account-service :
ribbon:
eureka:
enabled: false
listOfServers: localhost:8091
customer-service:
ribbon:
eureka:
enabled: false
listOfServers: localhost:8092
product- service:
ribbon:
eureka:
enabled: false
listOfServers: localhost:8093
开发人员还应该在项目中包含以下依赖项,以便将RestTemplate与Ribbon客户端结合在一起使用。
<dependency>
<groupId>org . springframework. cloud</groupId>
<arti factId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot/groupId>
<artifactId>spring-boot -starter-web</artifactId>
</ dependency>
然后,开发人员可以通过声明application.yml 中配置的名称列表来启用Ribbon 客户端。为完成此操作,可以使用@RibbonClients注解main类或任何其他Spring配置类。开发人员还应该注册RestTemplate bean 并使用@L oadBalanced注解它,以启用与SpringCloud组件的交互。
@SpringBootApplication
QRibbonClients ({
@RibbonClient (name - " account-service"),
@RibbonClient (name = "customer-service") ,
eRibbonClient (name = "product-service")
})
public class OrderApplication
@LoadBalanced
@Bean
RestTemplate restTemplate() (
return new RestTemplate() ;
}
public static void main(String[] args);
}
//...
}
总结
因为文章包含的内容实在是太多了,就不给大家做过多的介绍了,需要这份文档来学习的小伙伴,可以转发此文关注小编。
扫码来获取就可以了!
以上是关于你是否精通springcloud:使用SpringCloud进行同步通信?的主要内容,如果未能解决你的问题,请参考以下文章
精通springcloud:分布式日志记录和跟踪使用,Spring Cloud Sleuth