当在微服务项目中不同模块之间需要实现服务调用时,都是通过注册中心来实现,目前常见的注册中心如下:
- Eureka(原生,2.0遇到瓶颈,停止维护)
- Zookeeper(支持,专业的独立产品。例如:dubbo)
- Consul(原生,GO语言开发)
- Nacos
相对于 Spring Cloud Eureka 来说,Nacos 更强大。
Nacos = Spring Cloud Eureka + Spring Cloud Config
Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config。
下面介绍Nacos基础设施服务作为注册中心及springcloud+nacos的简单应用。
一、Nacos
Nacos(Dynamic Naming and Configuration Service),是阿里巴巴推出来的一个开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

1、Nacos 的关键特性
- 服务发现:支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
- 服务健康监测:提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
- 动态配置服务:动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
- …
更多查看nacos中文网。
2、Nacos实现服务注册与发现的示意图如下(摘自官网)

3、Nacos下载安装
下载地址如下https://github.com/alibaba/nacos/releases

选择指定的环境、稳定的版本的zip包,解压到指定目录即可,如下

在本地创建数据库,执行nacos-mysql.sql文件;修改application.properties文件,将数据库配置改为本地数据库,如下

进入bin目录,启动命令,startup.cmd -m standalone启动nacos服务。

打开浏览器,访问地址http://localhost:8848/nacos/

账号密码默认为:nacos

Nacos环境启动完成。
4、注册中心和配置中心
分布式系统中,包含多个独立的服务,服务之间存在需要调用的需求,应该如何调用?
服务调用时必须知道目标服务实例的 IP、端口、API 接口,知道了目标服务实例的地址,就相当于发现了对方。当服务实例很少的时候,每个服务可以自己维护相关服务实例的地址信息,相当于通讯录,但当服务实例很多后,自己维护就很麻烦了,这就出现了注册中心。
每个服务实例启动之后,都主动向注册中心登记自己的地址信息,这样注册中心便拥有了所有服务实例的记录,当某个服务实例停止运行的时候,主动让注册中心销毁自己的信息。若要能够实时知道每个服务实例的状态,通过心跳机制来实现,维护所有的服务实例。
每个服务都会有自己的配置信息,例如 SpringBoot 项目中的配置文件,服务运行时会读取配置文件中的配置项。当修改配置文件时需要重新部署此服务的所有实例,又很麻烦。如果把服务的配置信息提出来,不放在自己的配置文件中,而是放到一个第三方的配置中心,服务实例从配置中心读取属于自己的配置,而且,在配置中心里面修改配置项之后,所有相关实例都可以立即拿到最新值,不用重新部署了,这样就方便很多。配置中心中集中维护优于分散式的维护每个服务的配置文件,且配置修改后直接生效,不用重新部署。
二、springcloud+nacos
Nacos是可以代替SpringCloud Eureka和SpringCloud Config的开源组件,直接下载最新的稳定版即可,windows下通过start -m standalone命令启动服务。
面向springcloud的使用者,通过引入如下依赖来实现分布式环境下的配置管理和服务注册发现:
- 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。
- 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${latest.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${latest.version}</version>
</dependency>
注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。
1、搭建一个Spring Cloud父工程,只包含pom文件,然后基于该父工程,分别创建服务提供者和服务消费者模块。父工程的pom文件核心依赖如下
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- spring cloud -->
<spring-cloud.version>2021.0.2</spring-cloud.version>
<spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
<!-- db && orm -->
<mysql.version>8.0.19</mysql.version>
<druid.version>1.2.4</druid.version>
<mybatis-plus.version>3.4.3</mybatis-plus.version>
<!-- tools -->
<lombok.version>1.18.18</lombok.version>
<hutool.version>5.7.21</hutool.version>
<mapstruct.version>1.5.0.RC1</mapstruct.version>
</properties>
<modules>
<module>msbd-gateway</module>
<module>mall-order</module>
<module>mall-product</module>
</modules>
<dependencyManagement>
<dependencies>
<!--Spring Cloud 相关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Spring Cloud & Alibaba 相关依赖-->
<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>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
2、服务提供者
pom依赖
<!-- Spring Cloud & Alibaba -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!-- 注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!-- 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
bootstrap.yml文件
spring:
application:
name: mall-product
profiles:
active: dev
server:
port: 8804
spring:
main:
allow-circular-references: true
mvc:
pathmatch:
matching-strategy: ant_path_matcher
cloud:
nacos:
# 注册中心
discovery:
server-addr: http://localhost:8848
# 配置中心
config:
# 本地启动
## server-addr: ${spring.cloud.nacos.discovery.server-addr}
server-addr: http://localhost:8848
启动类
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class ProductBootApplication {
public static void main(String[] args) {
SpringApplication.run(ProductBootApplication.class, args);
}
}
接口
@RestController
@RequestMapping("/product")
public class ProductController {
@GetMapping("/hello")
public Object hello() {
return "hello, this is product service";
}
}
3、服务消费者
pom依赖
<!-- Spring Cloud & Alibaba -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!-- 注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!-- 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 远程调用HTTP客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
bootstrap.yml文件
spring:
application:
name: mall-order
profiles:
active: dev
server:
port: 8803
spring:
main:
allow-circular-references: true
mvc:
pathmatch:
matching-strategy: ant_path_matcher
cloud:
nacos:
# 注册中心
discovery:
server-addr: http://localhost:8848
# 配置中心
config:
# 本地启动
## server-addr: ${spring.cloud.nacos.discovery.server-addr}
server-addr: http://localhost:8848
启动类
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class OrderBootApplication {
public static void main(String[] args) {
SpringApplication.run(OrderBootApplication.class, args);
}
}
接口
@RestController
@RequestMapping("/order")
@RequiredArgsConstructor
public class OrderController {
private final ProductFeignClient productFeignClient;
@GetMapping("/hello")
public Object hello() {
return "hello, this is order service";
}
@GetMapping("getHelloFromProduct")
public Object getHelloFromProduct() {
Object result = productFeignClient.getHello();
return result;
}
}
4、测试
先启动Nacos服务,然后启动服务提供者和服务消费者服务,访问如下



感兴趣的小伙伴可以试试,亲身体验其功能,理解其底层原理。
487

被折叠的 条评论
为什么被折叠?



