Nacos简介
什么是Nacos?
-
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
-
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
-
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
-
服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:
- Kubernetes Service
- gRPC & Dubbo RPC Service
- Spring Cloud RESTful Service
Nacos的关键特性
- 服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理
说明:因为Dubbo和Nacos的应用场景一般都是在微服务项目中,所以接下来以SpringCloud项目为基础,展示Dubbo集成Nacos作为注册中心
Nacos 安装及入门
看我的另外一篇文章:https://blog.csdn.net/java_cpp_/article/details/128052696
项目目录总览
以上均是Maven项目
Step01-搭建SpringCloud父项目
使用IDEA创建一个普通的Maven项目,项目名自定义即可也可以跟我一样命名为pringCloud-Dubbo-Nacos
,删除src目录
重点是配置pom.xml
下面展示我的配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mxf</groupId>
<artifactId>SpringCloud-Dubbo-Nacos</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules> <!-后续创建子项目才有以下配置-->
<module>ShopService</module>
<module>ShopService-Provider-8081</module>
<module>ShopService-Provider-8082</module>
<module>ShopService-Consumer-9091</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.cloud.version>2021.0.5</spring.cloud.version>
<spring.boot.version>2.6.13</spring.boot.version>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.18.22</lombok.version>
<mysql-connector-java.version>8.0.22</mysql-connector-java.version>
<mybatis.plus.version>3.4.3.4</mybatis.plus.version>
<spring.cloud.nacos.version>2021.0.4.0</spring.cloud.nacos.version><!--2.2.6.RELEASE-->
<spring.cloud.dubbo.version>3.1.2</spring.cloud.dubbo.version>
<nacos.version>2.1.1</nacos.version>
</properties>
<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-boot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--集成Nacos实现服务注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring.cloud.nacos.version}</version>
</dependency>
<!--集成Nacos实现动态配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${spring.cloud.nacos.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
</dependency>
<!--sentinel:服务限流、降级、熔断-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>${spring.cloud.nacos.version}</version>
</dependency>
<!--集成Dubbo实现服务的远程调用-->
<!--<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
<version>${spring.cloud.dubbo.version}</version>
</dependency>-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${spring.cloud.dubbo.version}</version>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--mybatis 启动器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
注意的是依赖版本尽量跟我一致,否则后续项目启动的时候会出现迷惑性bug(例如:启动时dubbo、nacos报出现循环依赖的问题),到此SpringCloud父项目就搭建完毕
Step02-服务接口模块
服务接口,我是一个购物服务为背景设计相关接口的,本模块可自定义,不一定要按照我的来
总览
重点是服务接口的定义
public interface ShopService {
// 查询所有商品
List<Goods> queryAll();
// 根据名称模糊搜索
List<Goods> queryByName(String name);
// 添加商品
int addGoods(Goods goods);
// 根据ID删除商品
int delGoods(int id);
// 购买商品
int shopping(int id);
// 测试使用
String hello(String name);
}
业务实体类(自由发挥):
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Goods implements Serializable {
private Integer id;
private String name;
private Double price;
private Integer nums; // 库存
private String description;
}
服务接口主要是定义后续的服务功能,比较简单
Step03-服务提供者模块
该模块主要是去实现前面编写的服务接口,用来完成具体的业务逻辑
总览
首先在pom.xml中引入相关的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringCloud-Dubbo-Nacos</artifactId>
<groupId>com.mxf</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ShopService-Provider-8081</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.mxf</groupId>
<artifactId>ShopService</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--集成Nacos实现服务注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--集成Nacos实现动态配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--集成Dubbo实现服务的远程调用-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--mybatis 启动器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
依赖成功引入后,就先编写配置文件application.yaml,上面截图中有个bootstrap.yml,该文件是后续使用Nacos作为配置中心时才需要的,我会更新后续教程,暂时把所有配置配置到本地项目即可
application.yaml
server:
port: 8081
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
spring:
application:
name: provider_application_8081
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.11.219:3306/test?useSSL=true&characterEncoding=utf-8&serverTimeZone=Asia/Shanghai&useUnicode=true
username: root
password: 123456
# dubbo的配置
dubbo:
application:
name: provider_application_8081 #配置应用名是为了加以区分不同的服务提供者
protocol:
name: dubbo
port: -1 # 端口设置为-1 是让dubbo自动在[20880, 65536]之间找一个可用的端口
registry:
id: nacos-registry
address: nacos://192.168.11.233:8848 # 在此配置nacos服务的IP地址及端口
config-center: # 可选
address: nacos://192.168.11.233:8848
metadata-report: # 可选
address: nacos://192.168.11.233:8848
下面重点介绍服务实现类ShopServiceImpl
/**
* 用 @DubboService 注解标记,就可以实现 Dubbo 的服务暴露
* 如果要设置服务参数,@DubboService 也提供了常用参数的设置方式。如果有更复杂的参数设置需求,则可以考虑使用其他设置方式
* @DubboService(version = "1.0.0", group = "dev", timeout = 5000)
*/
@DubboService
@Service
public class ShopServiceImpl implements ShopService { // 实现前面定义的服务接口
@Autowired
private GoodsService goodsService; // 使用MyBaits-Plus做业务层持久框架实现的DAO层服务类,该服务自行实现,就不展示
@Value("${spring.application.name}")
private String applicationName; // 把服务名注入进来主要是用来识别不同服务提供者
@Override
public List<Goods> queryAll() {
return goodsService.list();
}
@Override
public List<Goods> queryByName(String name) {
QueryWrapper<Goods> wrapper = new QueryWrapper<>();
wrapper.like("name", name);
return goodsService.list(wrapper);
}
@Override
public int addGoods(Goods goods) {
return goodsService.save(goods) ? 1 : 0;
}
@Override
public int delGoods(int id) {
return goodsService.removeById(id) ? 1 : 0;
}
@Override
public int shopping(int id) {
return goodsService.shopping(id);
}
@Override
public String hello(String name) {
return "Hello: " + name + " From " + applicationName;
}
}
启动类的编写
@SpringBootApplication
@EnableDubbo // @EnableDubbo 注解必须配置,否则将无法加载 Dubbo 注解定义的服务,@EnableDubbo 可以定义在主类上
public class ProviderApplication_8081 {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication_8081.class, args);
}
}
OK,持久层代码就不展示了较为容易实现都是固定写法,一个端口为8081的服务提供者模块编写成完成,接下来在编写运行在8082端口的服务。
Step04-8082端口上的服务提供者
该模块跟8081服务全部一样,直接复制上面那个项目进行部分修改即可
总览:
- 改下启动类的类名
- 修改配置文件中的端口及应用名
server:
port: 8082
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
spring:
application:
name: provider_application_8082
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.11.219:3306/test?useSSL=true&characterEncoding=utf-8&serverTimeZone=Asia/Shanghai&useUnicode=true
username: root
password: mxf520
# dubbo的配置
dubbo:
application:
name: provider_application_8082
protocol:
name: dubbo
port: -1
registry:
id: nacos-registry
address: nacos://192.168.11.233:8848
config-center:
address: nacos://192.168.11.233:8848
metadata-report:
address: nacos://192.168.11.233:8848
到此服务提供者模块全部实现
Step05-服务消费者模块
该模块主要是调用8081、8082端口的服务
总览:
导入依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringCloud-Dubbo-Nacos</artifactId>
<groupId>com.mxf</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ShopService-Consumer-9091</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.mxf</groupId>
<artifactId>ShopService</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--集成Nacos实现服务注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--集成Nacos实现动态配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--集成Dubbo实现服务的远程调用-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
</dependencies>
</project>
配置文件applicatin.yaml:
server:
port: 9091
spring:
application:
name: consumer_application_9091
# dubbo的配置
dubbo:
application:
name: consumer_application_9091
protocol:
name: dubbo
port: -1
registry:
id: nacos-registry
address: nacos://192.168.11.233:8848
config-center:
address: nacos://192.168.11.233:8848
metadata-report:
address: nacos://192.168.11.233:8848
实现远程服务调用
@RestController
public class ShopController {
/**
* @Reference 注解从 3.0 版本开始就已经废弃,改用 @DubboReference,以区别于 Spring 的 @Reference 注解
* @DubboReference 注解将自动注入为 Dubbo 服务代理实例,使用 shopService 即可发起远程服务调用
*/
@DubboReference
private ShopService shopService;
@GetMapping("/queryAll")
public List<Goods> queryAllGoods() {
return shopService.queryAll();
}
@GetMapping("/queryByName")
public List<Goods> queryByName(String name) {
return shopService.queryByName(name);
}
@GetMapping("/hi")
public String hello(String name) {
return shopService.hello(name);
}
}
启动类:
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication_9091 {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication_9091.class, args);
}
}
OK,整个项目搭建到此已经完成,下面看项目运行展示
项目演示
首先启动Nacos(这里就以单机模式启动)
然后启动两个服务提供者:
ProviderApplication_8081
和ProviderApplication_8082
最后启动服务消费者:
ConsumerApplication_9091
OK,现在服务全部启动完毕,下面看nacos中的注册信息
可以看到,两个服务提供者和一个服务消费者全部注册进来了,到此Nacos就作为一个注册中心实现了服务注册功能
下面进行消费者端的远程服务调用测试:
接口测试
先看下之前定义的服务接口:
public interface ShopService {
// 查询所有商品
List<Goods> queryAll();
// 根据名称模糊搜索
List<Goods> queryByName(String name);
// 添加商品
int addGoods(Goods goods);
// 根据ID删除商品
int delGoods(int id);
// 购买商品
int shopping(int id);
// 测试使用
String hello(String name);
}
-
首先测试hello()方法
在消费端9091调用:
可以看到是8081端口的提供者响应服务,多调用几次就能看到8082端口的提供者响应服务了:
该服务的实现是在8081、8082两个端口处实现的,消费端只是进行了一次RPC远程调用通过Dubbo实现的,同时也体现了Nacos注册中心的服务发现功能
-
测试查询所有商品的接口:
成功与后端数据库连通,就可以在此基础上进行更为复杂的业务开发了。
Nacos作为配置中心
待更新…
转载请标明出处:https://blog.csdn.net/Java_cpp_/article/details/128051413