集群模式
环境:Ubuntu 18.04 LTS 三台,地址分别为:
192.168.2.11:8848
192.168.2.12:8848
192.168.2.13:8848
没有三台的小伙伴可以搭建一个伪集群用于测试,如127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
集群模式搭建十分简单,具体步骤如下:
- 将单机模式的配置复制三份到每个节点中
- 在每个节点的conf文件夹下新建
cluster.conf
,配置如下
192.168.2.11:8848 192.168.2.12:8848 192.168.2.13:8848
- 依次启动各个节点
bash startup.sh
这样子nacos集群就搭建好了,但是在浏览器访问时我们还需要一个nginx做负载均衡
变变变,变成一个nginx,如果没有nginx的小伙伴可以参考安装Nginx
- 配置反向代理
server { listen 8850; server_name _; location / { proxy_pass http://nacos-server; } } upstream nacos-server { server 192.168.2.13:8848 weight=5; server 192.168.2.12:8848 weight=5; server 192.168.2.11:8848 weight=5; }
访问
由于我的Nginx在192.168.2.11上,所以我的访问地址为:192.168.2.11:8848/nacos,初始账号密码同单机模式:nacos | nacos
Nacos Spring Cloud
Nacos已经搭建好了,接下来就是使用了。
下面阿鉴给大家介绍一下如何在Spring Cloud项目中使用Nacos
基本使用
新建项目
- 新建一个
my-micro-service-demo
项目,并在pom.xml
中增加Spring Cloud相关依赖
<properties> <java.version>1.8</java.version> <spring.cloud-version>Hoxton.SR8</spring.cloud-version> <spring.cloud.alibaba-version>2.2.5.RELEASE</spring.cloud.alibaba-version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring.cloud-version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring.cloud.alibaba-version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- 在项目中增加两个子模块,分别为
my-order
和my-goods
, 并引入Nacos的依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
- 编写
bootstrap.yaml
配置文件
server: port: 8080 spring: application: name: my-order main: allow-bean-definition-overriding: true cloud: nacos: discovery: server-addr: 192.168.2.11:8850 username: nacos password: nacos management: endpoints: web: exposure: include: "*"
商品服务修改一下服务名和端口号即可
- 编写启动类
package com.my.micro.service.order; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author Zijian Liao * @since 1.0.0 */ @SpringBootApplication public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } }
- 启动项目,查看Nacos控制台
服务注册成功
发起调用
服务已经注册到Nacos上了,接下来,我们尝试使用订单服务调用商品服务吧
在画的原理图中,订单服务是使用的一个调用组件
调用商品服务,大家先不必关心这个调用组件是什么,关于这部分内容,阿鉴会在后续的文章中详解介绍。
- 在商品服务中编写一个接口
@RestController @RequestMapping("/goods") public class GoodsController { @GetMapping("/get") public String get(){ return "商品服务响应了一个苹果"; } }
- 在订单服务中注入调用组件
@LoadBalanced @Bean public RestTemplate restTemplate(){ return new RestTemplate(); }
增加@LoadBalanced注解会使RestTemplate增加基于服务名进行调用的功能
- 发起调用
@RestController @RequestMapping("/order") public class OrderController { @Resource private RestTemplate restTemplate; @GetMapping("/get") public String get(){ // 旧方式:restTemplate.getForObject("http://127.0.0.1:8081/goods/get", String.class) // 现在直接使用服务名即可发起调用 return restTemplate.getForObject("http://my-goods/goods/get", String.class); } }
- 测试
优雅上下线
Nacos还提供服务实例的上下线操作,在服务详情页面,可以点击实例的上线
或者下线
按钮,被下线的实例,将不会再被服务所获取。
当然,前面也提到了,由于缓存的原因,服务下线后,调用方并不能立即感知到,需要等待一定的时间。
那么,这个功能可以用来做什么呢?
假设商品服务需要升级
运行版本:v1.0.0
升级版本:v1.1.0
我们先将v1.1.0部署到生产环境中,此时商品服务便有了两个实例v1.0.0和v1.1.0,紧接着我们需要将旧版本下线
如果我们直接停止服务,此时商品服务正在处理业务,业务被中断,造成的后果不可估摸。
如果我们先将v1.0.0下线,等待一段时间,此时便不会有服务再访问v1.0.0了,便可以安全停止服务了。
命名空间
在以往的注册中心里,一般都是一个注册中心只对应一整个微服务系统,这是因为只要有服务注册到了注册中心上,那么只要在这个注册中心上的服务,都是可以相互访问的,这样就造成了每一个微服务系统,都要有一个自己的注册中心,比如Eureka。
这就会造成一个资源浪费的问题,因为一个注册中心明明是可以注册成千上万的实例的(Nacos服务发现性能测试报告),所以,Nacos还给我们提供了命名空间的功能,这使得服务与服务之间拥有了隔离机制(同一个命名空间下的服务才能相互访问),这样,每个命名空间便可以对应一个微服务系统。
- 新增命名空间
新增一个dev
命名空间与test
命名空间 - 修改服务配置
修改my-goods, 让my-goods处于dev命名空间下
server: port: 8081 spring: application: name: my-goods main: allow-bean-definition-overriding: true cloud: nacos: discovery: server-addr: 192.168.2.11:8850 namespace: dev username: nacos password: nacos
- 修改my-order, 让my-order处于test命名空间下
server: port: 8080 spring: application: name: my-order main: allow-bean-definition-overriding: true cloud: nacos: discovery: server-addr: 192.168.2.11:8850 namespace: test username: nacos password: nacos
- 重启服务
查看Nacos控制台
my-goods
my-order - 测试
此时服务已经隔离了
小结
关于注册中心和Nacos的基本知识已经介绍完了,现在我们来总结一下吧。
首先,注册中心是一个具备了服务注册,服务发现,服务健康检查等能力的服务,通过它我们能够轻松地对服务进行管理,在此之上,Nacos还实现了优雅上下线,命名空间等功能,最后,我们还通过一个案例对这些功能进行了演示。
下篇,阿鉴会给大家介绍Nacos的另一项能力:配置中心。