服务注册和配置中心
目前Spring Cloud有很多的版本,但不管哪个版本,服务的注册和配置都是微服务的开端。
那么什么是服务注册呢?
一个公司里面的项目可能非常多,而项目直接又相互依赖,比如订单系统、物流系统、支付系统等,他们直接要相互调用,如果人工去维护他们直接的接口,那工作量肯定巨大,而且人为的难免会出错,这时候服务注册中心的用处就来了,每个系统都需要到它那里对接,注册中心可以集合各服务地址,并且维护他们之间的关系,确保各服务可用。
例如小区的物业拥有各居民的联系方式,每户人家入住和出户都要去他那里登记。所以我们想找某户人家,直接去他那里查就行。
那么配置中心是什么呢?
例如公交车系统有一个人员类型的配置person_type,目前只有司机、乘务员、普通乘客。后来搞活动出现了一个特殊乘客的类型,此时如果没有配置中心,可能需要改所有关于人员配置的代码,而使用配置中心,只需要在配置管理平台加一条person_type为特殊乘客的配置即可。
Spring Cloud本来使用Eurake作为服务注册中心,但是他已经停更了,这对于正在飞速发展的微服务来说无疑是巨大的打击。所以强大的阿里巴巴出了自己的版本,并使用Nacos作为注册中心和配置中心。
中文文档-SpringCloud Alibabagithub.com
Nacos服务端安装
nacos是需要安装服务端才能访问的,这里我们称之为Nacos Server,我们写的代码全都称为客户端(我入门时懵逼了很久,一直问为什么无法访问)
Nacos服务端下载github.com
Linux和Windows版本的都有,具体的安装教程我就不说了,百度一大把,官方文档如下
Nacos中文文档nacos.io
但是要安装后配置时要注意以下两点:
1、Linux安装时要注意内存大小,我当时安装时就是内存空间不足,无法分配
2、nacos自带数据库,如果使用自定义的数据库,需要建好数据库,并创建表结构
Nacos的sql地址github.com
我是在Centos7中使用docker安装的,用docker容器管理这些软件,真香!
另外关于阿里云服务器不知道如何配置的同学可以关注我的公众号:全栈船长,里面有我的微信
最后访问的服务端如下
Nacos客户端
前面说了,我们使用nacos都属于客户端,而客户端又分为服务提供者和服务消费者。无非就是一个提供接口,一个访问接口,例如客服系统需要查看订单,就要访问订单系统的接口。
一个spring cloud项目是有众多服务的,也就是众多模块module,所以我们需要创建一个父工程,在父工程中统一maven依赖的版本,这样就能实现module的依赖管理
1、创建maven项目作为父工程
2、删除src目录,因为这仅仅是为了管理依赖,不需要写代码。在pom.xml文件中添加SpringCloud Alibaba的依赖和Spring Boot的依赖,注意都是2.x的版本
服务提供者
服务提供者是提供接口给消费者调用的,所以它跟正常的spring boot项目无差异,只是需要将自己作为一个服务注册到nacos注册中心去
1、创建一个spring boot的web项目,并将pom.xml中的<parent>改成父工程的依赖,然后添加spring-cloud-starter-alibaba-nacos-discovery依赖
2、修改application.yml配置文件,配置上面我们安装的nacos服务的地址,并且定义服务提供者的端口号为1001
3、在启动类中添加开启服务注册的注解,这样才会向Nacos发送注册信息,成为一个服务
4、最后可以编写一个Controller,对外提供接口
此时启动该服务提供者,打开Nacos Server服务端的服务列表,就可以看到我们刚刚启动的服务被注册进来了。
注意服务名就是我们的spring-application-name参数,目前我们端口号为1001的应用名叫nacos-provider-appName,我们可以创建多个不同端口号的项目,如1002、1003、1004,然后他们的应用名都叫nacos-provider-appName,此时注册到Nacos服务中心去,你们猜会怎么着?
没错,它的实例数量会变成4个,并且当客户端去访问时,可以通过负载均衡算法选择其中一个,减少单个服务的压力
服务消费者
1、按上面的方式创建一个springboot项目,并且按上面的方式修改依赖,最后修改application.xml配置文件,将服务名改成nacos-consumer-appName,代表消费者,将端口号改成2001。
2、在启动类中,除了添加服务注册的注解@EnableDiscoveryClient,我们还需要使用RestTemplate作为访问服务提供者接口的工具,其中@LoadBalanced注解是用于负载均衡的,也就是上面说的在多个相同服务中选取一个进行访问
注意:在nacos中必须添加这个注解才能用RestTemplate访问,否则会报错找不到服务,而Euraka中不会
3、创建一个Controller,用于访问服务提供者的接口。平时我们调用接口都是用url的方式,如http://localhost:1001/echo/hello。在Nacos中,我们可以使用服务名去访问,这样就可以不用管服务端的ip和端口号的变化
此时启动消费者,可以看到Nacos Server服务端的服务列表中多了一个消费者实例。
此时调用消费者的接口,如下,说明消费者接收到请求后,又向服务提供者请求,最终拿到请求结果并返回
小结:上面实现的服务提供者和消费者就是依赖Nacos中的服务注册功能,Nacos维护了一份ip和服务名对照表(类似ip和域名),将每个服务都注册到Nacos中,然后直接通过服务名去访问即可。真香!
以上内容有不理解的地方可以关注我的公众号【全栈船长】,里面有我的微信,直接联系我。接下来我们看看配置中心又有何魅力!
Nacos配置中心
1、配置中心的配置都是放在Nacos Server的配置管理中,点击右边的+号按钮即可添加配置
2、需要配置的是DataID和Group,DataID其实就是这条配置的命名空间,而Group使用默认的即可
注意:配置项的等号两边不要出现空格,否则无法解析
DataID是有规律的,它是由下面的格式组成
//前缀-项目环境.数据格式
${prefix} - ${spring-profiles-active} . ${file-extension}
prefix:默认是应用名称nacos-provider-appName,也可以通过spring-cloud-nacos-config-prefix配置
spring-profile-active:当前项目环境,例如dev、test等,如果没配置则为空,连接符 - 也去掉
file-extension:配置内容的数据格式,目前只支持properties类型
3、修改端口号为1001的服务提供者的pom.xml文件,增加依赖spring-cloud-starter-alibaba-nacos-config
4、在resources文件夹下添加一个配置文件bootstrap.yml,填写配置中的的配置。
为什么不在application.yml中配置呢?大家都知道boostrap.yml的加载顺序高于application.yml,所以读取到boostrap.yml时就会去连接Nacos Server并拿到该应用程序对应的配置,如果放在application.yml中配置的话,你会发现启动时就报错
5、在Controller中添加读取配置的接口
6、在端口为2001的服务消费者中读取服务提供者的接口
重新启动服务提供者和服务消费者,访问服务消费者http://localhost:2001/config
此时已经成功拿到配置,这时候公交车的票价升为3元了,同时人员类型增加了一个【特殊乘客】,那么我们不需要动任何代码,只需要修改Nacos Server中的配置即可
重新访问服务消费者
真香!!
不过这里有几个注意事项:
1、先在Nacos Server中按一定规则添加相应的配置项,否则会报错
2、注意配置中心地址的配置,要放在bootstrap.yml中,否则还是找不到配置
如果对以上的内容有任何疑问的同学,可以关注公众号【全栈船长】,获取我的联系方式