概要

定义

  • 各个微服务项目将自己的 spring.application.name、ip 注册到Nacos
  • 注册的同时也会把Nacos的注册信息下载一份到本地,这样在调用其他服务接口时,只需要知道对方的name和接口地址即可,不用管具体IP是多少
  • 假设中途Nacos挂掉停止服务了,微服务也能继续互相调用接口。这是因为,之前的name+ip的绑定关系已经下载到本地了,具体接口的调用不需要经过Nacos

Spring Cloud Alibaba 实现 Nacos

创建个父工程,引入相关依赖,这边使用的版本如下

Spring Boot

Spring Cloud

Spring Cloud Alibaba

2.1.13.RELEASE

Greenwich.SR6

2.1.3.RELEASE

父工程 pom.xml 主要部分

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.13.RELEASE</version>
    </parent>

    <properties>
        <spring-cloud-version>Greenwich.SR6</spring-cloud-version>
        <spring-cloud-alibaba-version>2.1.3.RELEASE</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>

    <dependencies>
        <!--Spring Boot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--Spring Cloud-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

创建生产者模块

application.yml

spring:
  application:
    name: test-provider
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.25.131:8848

server:
  port: 8010

management:
  endpoints:
    web:
      exposure:
        include: "*"

启动类加上 @EnableDiscoveryClient 注解

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

定义接口,打印传递的name参数,并打印出当前端口号

@RestController
public class HelloController {

    @Value("${server.port}")
    private String port;

    @RequestMapping(value = "/echo/{name}", method = RequestMethod.GET)
    public String echo(@PathVariable String name){
        return "Hello Nacos:" + name + ",Port:" + port;
    }
}

运行生产者模块,测试echo接口正常访问就行。然后打开Nacos管理界面,会发现当前服务已注册到Nacos

nacos 中注册 redis 集群_服务注册发现

创建消费者模块

代码和生产者基本一样,这里贴出不一样的点:

application.yml 端口号改成8020

server:
  port: 8020

因为要用 RestTemplate 调用接口,所以需要声明Bean

@Configuration
public class ConsumerConf {

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

定义消费者接口,内部具体实现是调用生产者服务接口

@RestController
public class HelloController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/echo/{name}", method = RequestMethod.GET)
    public String echo(@PathVariable String name){
        return restTemplate.getForObject("http://test-provider/echo/" + name,String.class);
    }
}

启动消费者模块,查看Nacos管理界面,这时候发现多了个test-consumer,说明消费者也成功注册到Nacos了。

nacos 中注册 redis 集群_Spring Cloud_02

测试

我们的消费者是8020端口,用postman打开http://localhost:8020/echo/zhangsan,正常输出了生产者接口实现的代码。

nacos 中注册 redis 集群_Nacos_03

工程代码已上传网盘,有需要可以下载学习。

链接:https://pan.baidu.com/s/1cKChm5-lVeMtnZL1Ma1B6w
提取码:xnhj