服务注册与发现
微服务是把传统单体项目拆分为多个独立的服务,那么服务之间肯定会有互相调用,那么这么多的服务如何进行管理?那就需要用到服务注册和发现中心了。
将所有的服务自身的服务名以及IP端口号都登记到注册中心去,服务注册中心通过心跳等方式保证注册进来的服务都尽可能是可用的,并且可以动态的踢掉不可用的服务。任何服务如果需要调用其他服务,则根据服务名向服务注册中心查询该服务对应的IP和端口号,用于远程调用。
设想一下,如果没有服务中心的话,服务A调用服务B就必须知道服务B的地址,如果服务B的地址改了,那服务A还得修改相应的配置。虽然配置中心可以很方便地解决该问题,但是如果服务B是一个集群,该如何将来自服务A的请求分散到服务B中去处理?
这就是服务中心的一个好处,我们可以通过服务B的服务名进行调用,简单来说就是服务A通过服务B的服务名可以从注册中心获取到服务B的地址,从而进行调用。
负载均衡
这里就引出一个新的概念,将来自服务A的请求分配到服务B集群中的每一个服务中去,以提升性能的技术叫做负载均衡。
假如服务B存在多个同名的服务(也就是集群),那么服务A从注册中心可以拿到多个服务B的地址,服务A该用哪一个进行调用,这完全取决于客户端(服务调用方)的负载均衡策略。比如这一次调用使用地址1,下一次调用使用地址2,然后又是地址1,再是地址2,循环往复。
客户端负载均衡响应效率高,如果服务A也是一个集群,那每一个A服务都得有处理负载均衡的逻辑。不同的A服务之间并不知道其他A服务调用过哪一个B服务,有可能出现所有的A服务同时请求同一个B服务的情况,给B服务造成巨大压力。
因此,又出现了服务端负载均衡,拿Nacos来说,每个服务A通过服务B的服务名通过注册中心查询服务B的地址时,Nacos注册中心可以根据服务端负载均衡策略返回指定的服务B的访问地址给服务A用,此时客户端可以不再需要负载均衡。
服务注册中心的简单应用
在上篇文章创建的项目中,引入新的依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
在配置文件中新增服务发现相关配置,完整配置如下:
server: port: 8000 spring: application: name: service-test-config cloud: nacos: username: @nacos.username@ #@***@这种写法表示从pom.xml文件读取配置 password: @nacos.password@ config: file-extension: yaml server-addr: @nacos.server-addr@ #用于管理配置的nacos服务地址 namespace: @nacos.namespace@ #命名空间 discovery: server-addr: @nacos.server-addr@ #服务发现,服务注册中心地址,因为和配置中心使用同一个nacos,所以地址是同一个。 namespace: @nacos.namespace@ config: import: #springboot3必须配置此选项,至少配置一个,可以任意配置,配置后会使用nacos配置中心对应的配置 - optional:nacos:${spring.application.name}.yaml #前面加optional表示可选,允许配置服务器连接不成功时启动服务
启动项目之后,访问nacos后台Nacos。点击切换到对应的命名空间,如图所示,算是注册成功了。注意:很多教程说是要在启动类上加
@EnableDiscoveryClient
注解的,最新版本spring cloud已经不需要了。
评论区