目录
- 概述
- nacos工程案例
- nacos服务注册案例
- 版本说明
- 本地启动 nacos-server
- 搭建 spring cloud alibaba 最佳实践
- 服务注册案例
- 服务订阅案例
- nacos注册源码流程
- 源码关键点
- 技巧
- 结束
概述
通过本文,学会如何确定项目组件版本(减少可能出现的jar包冲突),nacos的注册与发现及其源码执行流程。
重点如下:
- 如何确定微服务工程组件版本
- 如何服务注册
- 如何阅读源码
nacos工程案例
nacos服务注册案例
- 源码地址:https://github.com/alibaba/spring-cloud-alibaba
- 版本说明:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明
- 本地启动 nacos-server
- 搭建 spring cloud alibaba 最佳实践
- long-cloud-provider 关键 pom 引用
版本说明
后续组件使用的版本如下:
**总结:**spring cloud 2021.0.5 、spring-cloud-alibaba 2021.0.5.0、spring-boot 2.6.13、nacos 2.2.0(因为本地mac系统版本低报错)、sentinel 、rocket mq 、seata 会根据约束自动加载。
本地启动 nacos-server
nacos源码搭建将使用
nacos 2.0.0
版本,
mac
系统低于此版本,2.x 出现如下问题。
所以暂时不提供,如果编译过程中有问题,欢迎留言。
搭建 spring cloud alibaba 最佳实践
服务注册案例
pom.xml 重要配置如下:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.13</version>
</parent><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><spring-cloud.version>2021.0.5</spring-cloud.version><spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
</properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><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></dependencies>
</dependencyManagement>
main 方法
@SpringBootApplication
@EnableDiscoveryClient
public class NacosRegistryProviderApplication {public static void main(String[] args) {SpringApplication.run(NacosRegistryProviderApplication.class);}
}
controller
@RestController
public class NacosRegistryProviderController {@GetMapping("/hello/{id}")public String echo(@PathVariable String id) {return "NacosProvider receive args: id=" + id + ",date:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());}
}
配置文件
spring:application:name: nacos-providercloud:nacos:discovery:server-addr: 10.xx.xx.142
server:port: 9010
pom.xml 配置
<dependencies><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-bootstrap</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
服务订阅案例
服务订阅 与 服务注册案例基本上配置相同
main 方法
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {public static void main(String[] args) {SpringApplication.run(NacosConsumerApplication.class);}@LoadBalanced@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
controller
@RestController
public class NacosDiscoveryConsumerController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/hello/{id}")public String echo(@PathVariable String id) {return restTemplate.getForObject("http://nacos-provider/hello/" + id, String.class);}
}
pom.xml
注意加上一个jar包,否则不能识别
微服务
名
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
nacos注册源码流程
源码关键点
注意: 为了解决其它流程影响正常 debug
源码,参考以下断点。通过下面关键断点,可以避开其它流程的影响,然后查看堆栈,基本可以理清 nacos
源码注册流程。
org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration#onApplicationEvent
com.alibaba.cloud.nacos.registry.NacosServiceRegistry#register
涉及监听器相关源码请移步 spring boot 事件机制
技巧
源码阅读是有一定的技巧的,在以后的文章中会慢慢讲述,今天讲述一个报错查看 nacos
源码注册流程。
org.springframework.boot.SpringApplication.run(SpringApplication.java:1317) ~[spring-boot-2.6.13.jar:2.6.13]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.6.13.jar:2.6.13]at com.fun.ms.NacosRegistryProviderApplication.main(NacosRegistryProviderApplication.java:11) ~[classes/:na]
Caused by: java.lang.reflect.UndeclaredThrowableException: nullat org.springframework.util.ReflectionUtils.rethrowRuntimeException(ReflectionUtils.java:147) ~[spring-core-5.3.23.jar:5.3.23]at com.alibaba.cloud.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:83) ~[spring-cloud-starter-alibaba-nacos-discovery-2021.0.5.0.jar:2021.0.5.0]at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.registerService(NamingGrpcClientProxy.java:123) ~[nacos-client-2.2.0.jar:na]at com.alibaba.nacos.client.naming.remote.NamingClientProxyDelegate.registerService(NamingClientProxyDelegate.java:98) ~[nacos-client-2.2.0.jar:na]at com.alibaba.nacos.client.naming.NacosNamingService.registerInstance(NacosNamingService.java:152) ~[nacos-client-2.2.0.jar:na]at com.alibaba.cloud.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:75) ~[spring-cloud-starter-alibaba-nacos-discovery-2021.0.5.0.jar:2021.0.5.0]... 27 common frames omitted
上术方法就是源码调试时,走的流程。
结束
nacos
注册与发现及源码注册流程至此就结束了,如有疑问,欢迎评论区留言。