Nacos服务提供者和发现者

232 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

1 Nacos可以代替Eureka

Nacos可以直接提供注册中心(Eureka)+配置中心(Config)的功能,它其实是在Eureka之上的一个升级,要比Eureka更加方便,不需要我们再自己做配置。

2 Nacos作为服务注册中心

服务发现是微服务架构中的关键组件之一。

  • Nacos Discovery可以自动将服务注册到 Nacos 服务器
  • 跟踪服务并动态刷新服务列表
  • Nacos Discovery 可以将服务实例的一些元数据,如主机、端口、健康检查 URL、主页等注册到 Nacos 官方文档:spring.io/projects/sp…

2.1 如何引入Nacos Discovery进行服务注册

2.1.1 创建新项目

image.png

2.1.2 POM文件

这里要特别注意spring boot和spring cloud的版本必须对应。

<?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.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.luke</groupId>
    <artifactId>AlibabaLuke</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>AlibabaLuke</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
        <spring-cloud-alibaba-version>2.2.0.RELEASE</spring-cloud-alibaba-version>
    </properties>
    <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.8.2</version>
            <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>

2.1.2 配置文件

server:
  port: 9001
spring:
  application:
    name: nacos-provider
  cloud:
    discovery:
      server-addr: 127.0.0.1:8848

management:
  endpoint:
    web:
      exposure:
        include:'*'

2.1.3 代码

@RestController
public class DemoController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/luke")
    public String getServerPort(){
        return "Hello Nacos Discovery"+serverPort;
    }
}

2.2 查看

image.png

3 服务消费者注册

新建一个项目作为消费者

server:
  port: 8083
spring:
  application:
    name: nacos-consumer
  cloud:
    discovery:
      server-addr: localhost:8848

此时我们再建一个一样的生产者,则nacos展示如下

image.png

4 消费者调用服务提供者

4.1 在消费者的启动类中添加如下代码

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

4.2 在进行调用的时候使用如下方法

@RestController
public class DemoController {
    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "consumer/nacos")
    public String getDiscovery(){
        return restTemplate.getForObject("http://nacos-provider/luke",String.class);
    }
}

getForObject方法一共有三个参数

  • 第一个参数:url表示被调用的目标Rest接口位置
    1. url的第一部分是在Nacos中注册的服务提供者名称,如果多个服务提供者注册相同名称,Ribbon会自动寻找其中一个服务提供者,并且调用接口方法。这个就是负载均衡功能。
    2. url后半部是控制器的请求路径。
  • 第二个参数:返回值类型
    • JavaBean类型或者JavaBean数组类型,如果控制器返回的是List集合,需要使用数组类型接收。
  • 第三个参数:可变参数
    • 是传递给url的动态参数,使用参数时候需要在url上需要使用{1}、{2}、{3}进行参数占位,这样传递的参数就会自动替换占位符。

4.3 访问

http://localhost:8083/consumer/nacos

image.png