SpringCloud Alibaba实战与源码深入剖析Nacos服务注册和发现
1.Nacos代替Eureka
Nacos可以直接提供注册中心(Eureka)+配置中心(Config),所以它的好处显而易见,我们在 SpringCloud Alibaba实g战与源码深入剖析Nacos下载安装 成功安装和启动了Nacos,我们发现Nacos本身就是一个小平台,它要比之前的Eureka更加方便,不需要我们在自己做配置。
2.Nacos服务注册
创建新项目
聚合项目:由于聚合带来的诸多好处,在SpringBoot项目开发中也广泛采用,开发中将SpringBoot项目按照功能分成子模块开发,所以我们在使用Spring Cloud Alibaba完成项目的时候,也是采用聚合项目来完成。
注:SpringBoot2.6.7、SpringCloudAlibaba2021.0.1.0、Nacos服务端的版本2.1.0,目前是最新版本。版本不对会报错。例如:
Error creating bean with name 'configurationPropertiesBeans' defined in class path resource
父项目cloud-alibaba的pom文件
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.6.7
com.mtg
cloud-alibaba
0.0.1-SNAPSHOT
cloud-alibaba
cloud-alibaba
pom
1.8
2021.0.1.0
cloud-nacos-provider
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring-cloud-alibaba-version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
子项目服务生产者cloud-nacos-provider的pom文件
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.mtg
cloud-alibaba
0.0.1-SNAPSHOT
com.mtg
cloud-nacos-provider
0.0.1-SNAPSHOT
cloud-nacos-provider
1.8
org.springframework.boot
spring-boot-starter-web
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
cloud-nacos-provider的配置
yml
server:
port: 9001
spring:
application:
name: nacos-provider
cloud:
discovery:
server-addr: 127.0.0.1:8848
management:
endpoint:
web:
exposure:
include:'*'
@SpringBootApplication
@EnableDiscoveryClient
public class CloudNacosApplication {
public static void main(String[] args) {
SpringApplication.run(CloudNacosApplication.class, args);
}
}
服务注册成功了
3.Nacos服务消费者
创建新项目cloud-nacos-consumer
父pom文件修改modules
cloud-nacos-provider
cloud-nacos-consumer
cloud-nacos-consumer配置
yml
server:
port: 8081
spring:
application:
name: nacos-consumer
cloud:
discovery:
server-addr: 127.0.0.1:8848
pm文件
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.mtg
cloud-alibaba
0.0.1-SNAPSHOT
com.mtg
cloud-nacos-consumer
0.0.1-SNAPSHOT
cloud-nacos-consumer
1.8
org.springframework.boot
spring-boot-starter-web
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class CloudNacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(CloudNacosConsumerApplication.class, args);
}
}
启动成功
注册成功
所以consumer也需要将服务注册到Nacos服务端,接下来就模拟生产者和消费者模型,生产者提供服务,消费者消费服务。
生产者接口服务:获取端口服务
@Value(value = "${server.port}")
private String serverPort;
@GetMapping("/serverPort")
public String getServerPortService() {
//获取当前服务的端口号
return "nacos-provider" + this.serverPort;
}
访问当前生产者提供的接口,直接访问
消费者调用生产者:获取生产者端口服务
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
Controller代码
@Resource
private RestTemplate restTemplate;
/**
* 消费者去访问具体服务,这种写法可以实现
* 配置文件和代码的分离
*/
@Value("${service-url.nacos-provider-service}")
private String serverURL;
@GetMapping("/getProviderPort")
public String getProviderServerPortService() {
return restTemplate.getForObject(serverURL+"/serverPort",String.class);
}
server:
port: 8081
spring:
application:
name: nacos-consumer
cloud:
discovery:
server-addr: 127.0.0.1:8848
service-url:
nacos-provider-service: http://nacos-provider
consumer的pom文件
org.springframework.cloud spring-cloud-loadbalancer 3.1.1
注:springcloud alibaba2021中的nacos discovery版本去除了ribbon的依赖,它自己提供了NacosBalancer,所以需要依赖loadbalancer的jar包,其它不变。
没有以上依赖通过RestTemplate方法生产者会报错,因为去除了ribbon的依赖
java.net.UnknownHostException: nacos-provider at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[na:1.8.0_40] at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_40] at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_40] at java.net.Socket.connect(Socket.java:538) ~[na:1.8.0_40] at sun.net.NetworkClient.doConnect(NetworkClient.java:180) ~[na:1.8.0_40] at sun.net.www.http.HttpClient.openServer(HttpClient.java:432) ~[na:1.8.0_40] at sun.net.www.http.HttpClient.openServer(HttpClient.java:527) ~[na:1.8.0_40] at sun.net.www.http.HttpClient.(HttpClient.java:211) ~[na:1.8.0_40] at sun.net.www.http.HttpClient.New(HttpClient.java:308) ~[na:1.8.0_40] at sun.net.www.http.HttpClient.New(HttpClient.java:326) ~[na:1.8.0_40]
访问消费者接口,消费者调用生产者接口
4.Nacos负载均衡
我们在启动一个nacos-provider,端口号为:9002,启动将会注册到nacosserver中
此时我们再去访问消费者,可以看到,负载均衡生效,默认是按照顺序。
号外号外:
《SpringCloudAlibaba从入门到实战》书籍,关注微信公众号,即可领取~~
老铁感兴趣关注下微信公众号,SpringCloudAlibaba实战和源码分析正在更新中~~~