从0搭建Java分布式系统 - 02 - 集成Nacos

150 阅读3分钟

一、Nacos介绍

官网:nacos.io

在分布式系统中,Nacos是微服务注册中心、同时也是微服务配置管理中心

二、搭建Nacos

搭建方式1:使用docker搭建,使用已有的Mysql5.7

搭建教程: juejin.cn/post/712871…

搭建方式2:本地启动单机(省事,本地开发方便)

到github下载Naocs github.com/alibaba/nac… 2.1.1版本: github.com/alibaba/nac…

解压后,到bin目录,找到startup.sh或startup.cmd,使用文本编辑器打开。把启动模式改成standalone(单机启动)。然后双击startup文件就能启动。

image.png

启动成功后,访问管理页面:http://localhost:8848/nacos/ 用户名和密码都是nacos。

三、项目集成nacos

3.1 使用注册中心和配置中心的理由

问题一:为什么要使用微服务注册中心?

答:1. 两个微服务通过网络协议进行数据交互,必须知道对方的ip和端口号。使用微服务注册中心后,可以将ip和端口号交给注册中心来管理。我们只需要给要访问的微服务定义一个applicationName,使用applicationName来代替ip地址和端口。就好像访问百度首页,我们使用域名(baidu.com)来访问,而不是使用ip地址+端口进行访问。

问题二:为什么要使用微服务配置中心。

答:分布式系统会有多个微服务,这些微服务肯定存在部分一样的配置,我们将这些配置称为共享配置。将共享配置抽取出来后,必须找一个地方存放,这个地方能被所有微服务访问。这时,nacos就提供了配置中心的功能。方便我们管理微服务的配置。

3.2 演示分布式系统微服务互相调用的场景

新建两个微服务。一个是user-service,两个是order-service。order-service提供一个查询订单的API,订单API又需要向user-servcie查询用户数据。

image.png

新增新建的微服务,只需要添加一个spring-boot-starter-web依赖。利用RestTemplate就可以访问到对方的服务器。如图所示:

image.png

可以看到,orderController中写死了user-service的ip地址和端口。下面将集成Nacos来简化微服务之间的调用: 官方教程: nacos.io/zh-cn/docs/…

步骤1:order-service和user-service都添加nacos-client依赖。

这个nacos-client的主要工作是向Nacos进行服务注册和发现。

添加依赖时,并没有指定版本号。因为我们在父目录的<dependencyManagement>中import了<artifactId>spring-cloud-alibaba-dependencies</artifactId>,在spring-cloud-alibaba-dependencies里面呢已经指定了版本号。

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

步骤2:在resources目录下,新建一个bootstrap.yml文件。在里面定义微服务名字,以及指定nacos地址

order-service的配置:

spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

user-service的配置:

spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

步骤3:修改OrderController访问user-service的url,使用applicationName代替ip+端口

image.png

步骤4:order-service的RestTemplate配置负载均衡器。这个负载均衡的工作,会向Nacos拉取服务列表,然后将请求路径中的服务名替换成ip+端口

image.png

重新访问order-service的api(http://localhost:8066/orders/1), 发现能正常读取到数据。到此为止,已经将nacos-client集成到微服务中去了。

完整代码:github.com/AllenDengMs…