一、介绍
1.1、什么是 nacos
-
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
-
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
-
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
1.2、nacos 特性
-
服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。 -
动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。 -
动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。 -
服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
1.3、什么是 dubbo
Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。
在云原生时代,Dubbo 相继衍生出了 Dubbo3、Proxyless Mesh 等架构与解决方案,在易用性、超大规模微服务实践、云原生基础设施适配、安全性等几大方向上进行了全面升级。
Dubbo 的开源故事
Apache Dubbo 最初是为了解决阿里巴巴内部的微服务架构问题而设计并开发的,在十多年的时间里,它在阿里巴巴公司内部的很多业务系统得到了非常广泛的应用。最早在 2008 年,阿里巴巴就将 Dubbo 捐献到开源社区,它很快成为了国内开源服务框架选型的事实标准框架,得到了业界更广泛的应用。在 2017 年,Dubbo 被正式捐献 Apache 软件基金会并成为 Apache 顶级项目,开始了一段新的征程。
1.4、dubbo 能做什么
- 微服务编程范式和工具
Dubbo 支持基于 IDL 或语言特定方式的服务定义,提供多种形式的服务调用形式(如同步、异步、流式等) - 高性能的 RPC 通信
Dubbo 帮助解决微服务组件之间的通信问题,提供了基于 HTTP、HTTP/2、TCP 等的多种高性能通信协议实现,并支持序列化协议扩展,在实现上解决网络连接管理、数据传输等基础问题。 - 微服务监控与治理
Dubbo 官方提供的服务发现、动态配置、负载均衡、流量路由等基础组件可以很好的帮助解决微服务基础实践的问题。除此之外,您还可以用 Admin 控制台监控微服务状态,通过周边生态完成限流降级、数据一致性、链路追踪等能力。 - 部署在多种环境
Dubbo 服务可以直接部署在容器、Kubernetes、Service Mesh等多种架构下。
(以上介绍均来自官方文档)
二、项目搭建
2.1、模块总体介绍
注意:在这里,我们搭建的项目只体现了 dubbo 用 nacos 做注册中心时,如何实现服务间调用,其他特性可自己探索
解释:
- consumer(消费者) 其实就是一个spring boot 项目,在这里命名为消费者,是因为它调用 provider 的方法
- provder (提供者) 其实也是一个spring boot 项目,在这里命名为提供者,是因为它提供了consumer需要调用的方法
注意: 消费者和提供者是相对的,在以后的开发中也可能互相调用哦 - dubbo-service 其实就是 consumer 和 provder 所共用的接口(通过 maven 坐标引入到 consumer 和 provider 中)
2.2、模块介绍
2.2.1 父工程介绍
父工程 pom:
<?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.siyu</groupId>
<artifactId>dubbo-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>consumer</module>
<module>provider</module>
<module>dubbo-service</module>
</modules>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--spring boot web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.0.2</version>
</dependency>
<!--nacos config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2022.0.0.0</version>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--nacos discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2022.0.0.0</version>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--nacos client-->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.3.2</version>
</dependency>
<!--dubbo spring boot 整合-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
</project>
2.2.2 consumer 介绍
在这里我先贴两张nacos的截图(nacos是有服务端的,需要部署),红色圈出的地方需要注意,下面配置中会用到
配置:
服务:
命名空间:
包结构:
pom:
<?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>
<parent>
<groupId>com.siyu</groupId>
<artifactId>dubbo-demo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>consumer</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- dubbo service 是共用接口 -->
<dependency>
<groupId>com.siyu</groupId>
<artifactId>dubbo-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--这里需要加上这个依赖,不然 bootstrap.yml 可能不生效 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.2</version>
</dependency>
</dependencies>
</project>
bootstrap.yml :
server:
port: 8080
spring:
application:
name: consumer
cloud:
nacos:
config:
server-addr: ip:8848 #nacos地址
extension-configs:
- data-id: consumer # nacos 中创建配置文件时配的 data-id
group: DEFAULT_GROUP #组
refresh: true
namespace: 26c0b883-68c6-4f1d-9ab6-aa4e7e1f70d2 # nacos 命名空间 id
discovery:
server-addr: ip:8848 #nacos地址
namespace: 26c0b883-68c6-4f1d-9ab6-aa4e7e1f70d2 # nacos 命名空间 id
dubbo:
application:
name: consumer #配置应用名是为了加以区分不同的服务提供者
protocol:
name: dubbo
port: -1 # 端口设置为-1 是让dubbo自动在[20880, 65535]之间找一个可用的端口
registry:
id: nacos-registry
address: nacos://ip:8848 # 在此配置nacos服务的IP地址及端口
UserController (这里应该写成orderController)代码中有些不合适但不影响
@RestController
public class UserController {
@Autowired
protected OrderService orderService;
@RequestMapping("user")
public String getUser() {
return orderService.getUser();
}
}
OrderService
@RefreshScope // 动态刷新(nacos中的配置改变时,要动态改变需要加这个注解,就是下面的 aa 变量)
@Service
public class OrderService {
@Value("${aa}") //此配置在nacos中,为了测试 nacos 的动态配置
private String aa;
@DubboReference(version = "1.0") // 这个注解说明这是一个dubbo的远程调用,并不是本地调用
private UserService userService;
public String getUser(){
return userService.getUser() + aa;
}
}
Application
@EnableDiscoveryClient //启动服务发现(nacos)
@SpringBootApplication
@EnableDubbo //启用dubbo
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2.2.3 dubbo-service 介绍
结构图:
这里只有单纯的接口,没有其他的(当然后续可能会有实体什么的),pom目前也是空的
2.2.4 provider 介绍
结构图:
pom:
<?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>
<parent>
<groupId>com.siyu</groupId>
<artifactId>dubbo-demo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>provider</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.siyu</groupId>
<artifactId>dubbo-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.2</version>
</dependency>
</dependencies>
</project>
没有什么其他依赖
bootstrap.yml
server:
port: 8081
spring:
application:
name: provider
cloud:
nacos:
config:
server-addr: ip:8848
extension-configs:
- data-id: provider
group: DEFAULT_GROUP
refresh: true
namespace: 26c0b883-68c6-4f1d-9ab6-aa4e7e1f70d2
discovery:
server-addr: ip:8848
namespace: 26c0b883-68c6-4f1d-9ab6-aa4e7e1f70d2
dubbo:
application:
name: provider #配置应用名是为了加以区分不同的服务提供者
protocol:
name: dubbo
port: -1 # 端口设置为-1 是让dubbo自动在[20880, 65535]之间找一个可用的端口
registry:
id: nacos-registry
address: nacos://ip:8848 # 在此配置nacos服务的IP地址及端口
这些配置在 consumer 中都有详细介绍,在这里 UserController 并没有实质性的作用,和 Dubbo 调用无关,接下来直接看 UserServiceImpl
UserServiceImpl
@DubboService(version = "1.0") // 这个注解就说明这是一个dubbo服务
public class UserServiceImpl implements UserService {
@Override
public String getUser() {
return "siyu";
}
}
ProviderApplication
@EnableDiscoveryClient
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
到这里,简单的 demo 搭建就完毕了(搭建时需要注意版本,避免冲突)
祝您遇见更好的自己