-
简介
-
准备工作
-
部署
-
Spring Boot 集成
-
配置说明
-
Spring Cloud + Nacos
-
Dubbo + Nacos
-
-
问题及解决方式
微服务现在越来火,有基于 Spring Cloud Netflix 体系的,也有基于 Spring Cloud Alibaba 为体系的。从以前的 Eureka 注册中心、Spring Cloud Config 配置中心、Spring Cloud Bus消息总线 到完全可以替代他们的 Nacos 出现,微服务技术体系的未来发展方向愈加清晰。所以,学会并了解如何使用 Nacos 是十分重要的。Nacos 不仅仅可以作为配置中心使用,还可以作为注册中心使用,其有很多十分优秀的特性,部署起来也十分方便。
主要目的:
- 熟练使用 Nacos;
- 基于 Spring Cloud Alibaba 体系进行项目基础 Demo 搭建,便于后续源码分析;
- 整合 Dubbo,便于后续源码分析;
手机用户请
横屏
获取最佳阅读体验,REFERENCES
中是本文参考的链接,如需要链接和更多资源,可以加入『知识星球』获取长期知识分享服务。
简介
- 动态配置服务
动态配置服务让您能够以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单,也让按需弹性扩展服务更容易。
- 服务发现及管理
动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服务发现。Nacos也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助Nacos,您可以更容易地为您的服务实现断路器。
- 动态DNS服务
通过支持权重路由,动态DNS服务能让您轻松实现中间层负载均衡、更灵活的路由策略、流量控制以及简单数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以消除耦合到厂商私有服务发现API上的风险。
准备工作
- Docker 运行环境
- Mysql 或 Mysql 的容器
部署
单机版本
# 拉取镜像
docker pull nacos/nacos-server
# 运行
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
.访问
http://127.0.0.1:8848/nacos/#/login
密码和账号默认都是 nacos
Spring Boot 集成
配置说明
.配置命名空间
Spring Cloud + Nacos
依赖配置
compile libs["spring-cloud-starter-alibaba-nacos-config"]
compile libs["spring-cloud-starter-alibaba-nacos-discovery"]
resources 下新建文件
bootstrap.yaml
# nacos 配置 (nacos config必须配置在bootstrap)
spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
namespace: ${NACOS_NAMESPACE:dsb-cloud}
metadata:
{"checkSum": "${random.value}-${random.uuid}"}
config:
server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
namespace: ${NACOS_NAMESPACE:dsb-cloud}
file-extension: yaml
服务注册中心
// 启动类开启注解
@EnableDiscoveryClient
作为 Spring Boot 项目启动后,可以看到成功注册到 Nacos 上了。
.点击详情后可以看到对应的服务信息
.Dubbo + Nacos
公共 API 包
.服务提供者
pom
dependencies {
compile libs["spring-boot-starter-actuator"]
//nacos
compile(libs["nacos-discovery-spring-boot-starter"]) {
exclude group: 'com.alibaba.spring', module: 'spring-context-support'
}
compile 'com.alibaba.spring:spring-context-support:1.0.3'
compile project(':spring-cloud-examples:dubbo-examples:spring-cloud-dubbo-api')
compile libs['dubbo-spring-boot-starter']
testCompile "org.springframework.boot:spring-boot-starter-test"
}
application.yaml
spring:
application:
name: spring-boot-dubbo-provider
dubbo:
application:
name: spring-boot-dubbo-provider
registry: nacos://127.0.0.1:8848
protocol:
name: dubbo
port: 20880
bootstrap.yaml
# nacos 配置 (nacos config必须配置在bootstrap)
spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
namespace: ${NACOS_NAMESPACE:dsb-cloud}
metadata:
{"checkSum": "${random.value}-${random.uuid}"}
config:
server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
namespace: ${NACOS_NAMESPACE:dsb-cloud}
file-extension: yaml
核心类
// 启动类
@SpringBootApplication
@DubboComponentScan
public class SpringBootDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDubboProviderApplication.class, args);
}
}
//服务实现类
package pub.dsb.api.service.impl;
import org.apache.dubbo.config.annotation.Service;
import pub.dsb.api.service.IHelloService;
@Service
public class HelloServiceImpl implements IHelloService {
@Override
public String hi(String name) {
return "spring-cloud-dubbo-example:" + name;
}
}
.启动服务提供者
服务消费者
- pom (和服务提供者一样)
dependencies {
compile libs["spring-boot-starter-web"]
compile libs["spring-boot-starter-actuator"]
//nacos
compile(libs["nacos-discovery-spring-boot-starter"]) {
exclude group: 'com.alibaba.spring', module: 'spring-context-support'
}
compile 'com.alibaba.spring:spring-context-support:1.0.3'
compile project(':spring-cloud-examples:dubbo-examples:spring-dubbo-api')
compile libs['dubbo-spring-boot-starter']
testCompile "org.springframework.boot:spring-boot-starter-test"
}
- yaml
spring:
application:
name: spring-boot-dubbo-consumer
dubbo:
registry:
address: nacos://127.0.0.1:8848
- 核心类
@RestController
public class DubboRefController {
@Reference(check = false)
private IHelloService helloService;
@GetMapping("/hi")
public String hi(){
return helloService.hi(System.currentTimeMillis() + "");
}
}
//启动类
@SpringBootApplication
public class SpringBootDubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDubboConsumerApplication.class, args);
}
}
-
接口测试
服务提供者 8080, 服务消费者 8081
GET http://127.0.0.1:8081/hi
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 40
Date: Tue, 01 Sep 2020 16:55:53 GMT
spring-cloud-dubbo-example:1598979353325
- 注册信息
问题及解决方式
ClassNotFoundException: com.alibaba.spring.util.BeanRegistrar
引用新包,剔除有问题的包 spring-context-support
。
No provider available for the service
@Reference(check = false)
本文分享自微信公众号 - 架构探险之道(zacsnz1314)。
如有侵权,请删除。