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文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.6.7</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <groupId>com.mtg</groupId>    <artifactId>cloud-alibaba</artifactId>    <version>0.0.1-SNAPSHOT</version>    <name>cloud-alibaba</name>    <description>cloud-alibaba</description>    <packaging>pom</packaging>    <properties>        <java.version>1.8</java.version>        <spring-cloud-alibaba-version>2021.0.1.0</spring-cloud-alibaba-version>    </properties>    <modules>        <module>cloud-nacos-provider</module>    </modules>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies>    <dependencyManagement>        <dependencies>            <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>    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build></project>

子项目服务生产者cloud-nacos-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 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>com.mtg</groupId>        <artifactId>cloud-alibaba</artifactId>        <version>0.0.1-SNAPSHOT</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <groupId>com.mtg</groupId>    <artifactId>cloud-nacos-provider</artifactId>    <version>0.0.1-SNAPSHOT</version>    <name>cloud-nacos-provider</name>    <properties>        <java.version>1.8</java.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>com.alibaba.cloud</groupId>            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>        </dependency>    </dependencies></project>

cloud-nacos-provider的配置

yml

server:  port: 9001spring:  application:    name: nacos-provider  cloud:    discovery:      server-addr: 127.0.0.1:8848management:  endpoint:    web:      exposure:        include:'*'​​​​​​
@SpringBootApplication@EnableDiscoveryClientpublic class CloudNacosApplication {    public static void main(String[] args) {        SpringApplication.run(CloudNacosApplication.class, args);    }}

服务注册成功了

3.Nacos服务消费者

创建新项目cloud-nacos-consumer

父pom文件修改modules​​​​​​​

<modules>    <module>cloud-nacos-provider</module>    <module>cloud-nacos-consumer</module></modules>

cloud-nacos-consumer配置

yml​​​​​​​

server:  port: 8081spring:  application:    name: nacos-consumer  cloud:    discovery:      server-addr: 127.0.0.1:8848

pm文件​​​​​​​

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>com.mtg</groupId>        <artifactId>cloud-alibaba</artifactId>        <version>0.0.1-SNAPSHOT</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <groupId>com.mtg</groupId>    <artifactId>cloud-nacos-consumer</artifactId>    <version>0.0.1-SNAPSHOT</version>    <name>cloud-nacos-consumer</name>    <properties>        <java.version>1.8</java.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>com.alibaba.cloud</groupId>            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>        </dependency>    </dependencies></project>

启动类:​​​​​​​

@SpringBootApplication@EnableDiscoveryClientpublic 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;    }

访问当前生产者提供的接口,直接访问

消费者调用生产者:获取生产者端口服务​​​​​​​

@Configurationpublic class RestTemplateConfig {    @Bean    @LoadBalanced    public RestTemplate restTemplate(){        return new RestTemplate();    }}

Controller代码​​​​​​​

@Resourceprivate 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: 8081spring:  application:    name: nacos-consumer  cloud:    discovery:      server-addr: 127.0.0.1:8848service-url:  nacos-provider-service: http://nacos-provider

consumer的pom文件​​​​​​​

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
    <version>3.1.1</version>
</dependency>

注: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.<init>(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实战和源码分析正在更新中~~~


版权声明:本文为zqy_zq_zxl原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。