本文共 2073 字,大约阅读时间需要 6 分钟。
比如用户系统中存在一个接口,底层实际调用的是订单服务的一个远程接口。
默认情况下,若是不引用任何其他技术,原生去调用,那么就会直接使用HTTP的restTemplate
什么是RestTemplate?
传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate。 详细可点击: 进行阅读
比如代码如下:
这种是可以调通的,但是呢,存在以下问题
若订单系统服务器设置了多台,那么需要如何调用做到负载均衡呢?图上,订单系统有多个实例,这里需要如何调用呢?
如果还是这样写: 永远只会调到一个机器实例。那怎么改造可以使得调用不同的服务器呢?,引申出Nginx配置
在早些年,微服务架构还流行的时候,一些大型的电商网站对后台服务已经进行了拆分,没有好的微服务架构的支撑,当时就是在服务中间添加了Nginx。
若某个子系统有多个服务器实例,则在Nginx中配置一个大的域名(比如多个订单系统的服务器域名为orde.com),对于这些域名在Nginx中进行负载均衡的转发配置(把订单微服务所有的服务器IP都映射到这个域名下面)。
那么在用户子系统中只需调用对应的域名,就会由Nginx将请求转发到每一台机器。配置Nginx实际调用如下:
用Nginx配置解决也存在问题,比如
1)没有错误检测 2)稳定性下降 3)配置繁琐 比如大的电商系统,到了大促的时候(每年双11),需要加很多机器,而且是几倍几倍增加。后端有几十甚至上百个微服务,每个微服务有一二十台机器,那么就意味着需要修改很多个Nginx的配置,而且大促一旦结束之后,马上就需要把多加的机器下线关掉,就有需要修改Nginx的配置,然后重启,是非常麻烦的,运维工作量太大了。到这里需要解决的最大的问题,就是负载均衡的问题,包括加服务器或者减服务器Nginx都要改配置重启,非常麻烦。
所以现在几乎没有公司在用Nginx来做后端子系统之间的交互
在没有流行微服务架构的时候,没有办法才使用了Nginx,现在一般来说都不会再用,而是选择微服务架构(比如Spring Cloud)在微服务架构中,引入了服务注册中心,主要是用来存储各个服务器的信息。
所有服务在启动的时候,会调用服务注册中心的接口,将本身的IP信息写入,在其他微服务需要调用的时候,则会先从注册中心将对应的服务IP列表拿到本地,然后再逐台自己实现负载均衡的逻辑,逐台调用。那么存在以下疑问:
要是再加服务器的话怎么办? 回答:加完服务器之后,肯定是需要启动的,那么在启动的时候,就会把自己的机器信息写到到服务注册中心对应的注册表,只要注册好之后,其他调用的服务会有相应的机制,动态获取服务列表,就可以调用到了。服务注册中心也是个web服务,当微服务系统启动时会调用服务注册中心对外提供的接口,把自己的机器信息写到对应的注册表中,所以服务注册中心在启动的时候也要指定Tomcat端口(内嵌的也是Tomcat启动)
重要注解:
@EnableEurekaServer 加了这个注解之后就会调用底层jar包的很多功能。Eureka这个Spring Cloud注册中心处理配置启动的端口,还有需要配置对外发布服务的根访问地址。
注册中心已经有了,服务子系统在启动的时候怎么把自己的信息传给注册中心呢?
回答:在服务子系统中处理引入SpringBoot的依赖包之外,还需要增加依赖包:spring-cloud-starter-netflix-eureka-client(也就是注册中心对应的客户端)。 客户端增加服务注册地址 Spring Cloud注册中心引入了Eureka的server端,实际上服务子系统对于server端来说都是注册中心的客户端,所有需要引入客户端。引入之后需要在客户端配置文件中增加注册地址地址是Eureka的server那边对外提供接口的统一地址,作为客户端最后要把信息传给服务注册中心,要调用到对外的接口,这里就是配置接口地址的地方
客户端增加服务名称
客户微服务在启动的时候把自己的一些信息传到Eureka的server端,还需要告诉Eureka,当前的这个客户微服务实例对应系统的整个服务的名称。
比如: 客户端相互调用 调用的时候参数URL就是调用在配置文件中设置的应用名称。 底层最终调用实际上就是从Eureka注册中心通过应用名称找到对应机器列表的地址,就可以知道要调用的微服务的所有机器列表实例,就可以在本地轮询去调用,每次调用一台机器。 实际的注册表信息如下图 微服务搭建步骤简要总结 ①、引入注册中心 ②、所有微服务都加上Eureka客户端的jar包 ③、注册信息 ④、每个微服务之间使用注册的服务名称相互调用转载地址:http://sayai.baihongyu.com/