nacos(四): 创建第一个消费者Conumer(单体)

接上一篇《nacos(三): 创建第一个生产者producer(单体)》,我们这一篇实现单体的消费者功能,准备与上一次的生产者集成在一个单体项目中。

消费者的本质其实就是向nacos注册后,通过负载均衡组件LoadBalancer获取服务地址,并通过OpenFeign或者RestTemplate等方式调用生产者提供的服务。在本次实验中,使用LoadBalancer+RestTemplate进行服务调用。

创建消费者一般需要以下步骤:

步骤一:

添加spring-cloud-starter-alibaba-nacos-discovery依赖,向nacos注册自己。这一步和创建生产者的步骤一致,不再赘述。

步骤二:

在pom.xml中引入LoadBalancer(这个过程中,还是要注意版本的匹配):

复制代码
<?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>

    <groupId>com.nacos</groupId>
    <artifactId>springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot</name>
    <description>Demo project for Spring Boot</description>
    <packaging>jar</packaging>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.6</spring-boot.version>
        <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
    </properties>
    <dependencies>
        <!--springboot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

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

        <!--消费者-->
\<dependency\>
\<groupId\>org.springframework.cloud\</groupId\>
\<artifactId\>spring-cloud-starter-loadbalancer\</artifactId\>
\<version\>3.1.5\</version\>
\</dependency\>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.nacos.springboot.SpringbootApplication</mainClass>
                    <skip>false</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

步骤三:

在application.yml中,开启LoadBalancer:

复制代码
server:
  port: 8085

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos
      config:
        server-addr: 127.0.0.1:8848
        file-extension: properties
        username: nacos
        password: nacos
loadbalancer:
nacos:
enabled: true

  application:
    name: product1

如果没有在配置文件中开启,用服务名调用生产者的服务时,URL会解析不出来,报UnknownHostException。

步骤四:

添加RestTemplate的配置类

复制代码
@Component
public class BeanManageConfig {

    @Bean
    @LoadBalancedpublic RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

其中@LoadBalanced注解上创建出来的RestTemplate具备负载均衡的能力。

到了这一步,消费者的配置已经都准备好了。下一个步骤就是尝试调用生产者服务,确认是否可以调用成功。

步骤五:

在项目中创建一个Controller,尝试调用服务:

复制代码
@RestController
public class Consumer {

    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/c/echo")
    public String echo(){
        String url = "http://product1/hello/";
        System.out.println(url);
        ResponseEntity<String> forEntity = this.restTemplate.getForEntity(url, String.class);
        return forEntity.getBody();
    }

    @RequestMapping("/c/services")
    public String serviceslist(){
        List<ServiceInstance> instances = discoveryClient.getInstances("product1");
        if (instances != null && !instances.isEmpty()) {
            for(ServiceInstance s:instances){
                System.out.println(s.getHost()+":"+s.getPort());
            }
            return "Service found!";
        } else {
            return "Service not found!";
        }
    }
}

在这段代码中,echo()方法里调用了名为product1的生产者的服务;servicelist()方法测试product1服务是否可以获取到,并输出获取到的可用地址。

单体消费者的创建与配置到这里就结束了,关于RestTemplate的深入运用将在之后的文章中慢慢探讨。下一篇将会介绍如何操作nacos中的配置项,并定时同步远程最新配置项方法。