Spring Cloud Alibaba 学习 -- 1、Nacos 服务注册与发现

207 阅读2分钟

这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

学习视频(B站):www.bilibili.com/video/BV1Mt…
GitHub 源码地址:github.com/tyronczt/sp…

学习计划

  1. Nacos 服务注册与发现
  2. Ribbon 负载均衡
  3. Sentinel 流量控制
  4. RockerMQ 消息的生产和消费
  5. Gateway 路由映射和限流

零、项目初始化搭建

创建父工程,作为项目的大环境,微服务的各个组件作为子项目,继承父项目。

首先确保 JDK、Maven、IDEA 安装正常.

Maven 推荐配置文件 maven的settings.xml文件

父项目根据 Spring Initializr 自动创建项目,并添加 spring-cloud-dependenciesspring-cloud-alibaba-dependencies 的依赖,注意踩坑点:pom 中的那几个依赖先放到springboot自带的 dependencies 中,然后再添加到 DependentDependencyManagement 中,否则会导致依赖下载不下来的问题。

具体pom.xml文件,参看代码: github.com/tyronczt/sp…

一、Nacos 服务注册与发现

官网安装包下载地址:github.com/alibaba/nac…

免费下载地址:download.csdn.net/download/ti…

此处使用 Windows 环境,解压zip文件,进入bin目录,双击 startup.cmd ,会弹出命令框启动nacos程序,如果弹出后立即消失,记得检查下 JAVA_HOME 是否配置!

此时访问地址:http://localhost:8848/nacos

在这里插入图片描述

创建provider项目

继承父项目,并加入nacos-discovery 的依赖

<parent>
    <groupId>com.tyron</groupId>
    <artifactId>springcloudalibabademo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

配置application.yml

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: provider
server:
  port: 1111/2222/3333

启动项目时,Edit Configurations,将 Allow parallel run 的选项勾上,最终: 在这里插入图片描述

创建consumer项目

pom.xml文件同 provider 项目类似

新建 ConsumerController,对服务注册情况进行查看

@RestController
public class ConsumerController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/instances")
    private List<ServiceInstance> instances(){
        return this.discoveryClient.getInstances("provider");
    }

}

启动后浏览器查看 instances

通过 RestTemplate 远程调用 Provider 的服务

provider 提供服务

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

@GetMapping("/index")
public String index() {
	return port;
}

consumer 配置 RestTemplate

@Configuration
public class ConsumerConfig {

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

ConsumerController 随机调用 provider 服务

@Autowired
private RestTemplate restTemplate;

@GetMapping("/index")
public String index() {
    List<ServiceInstance> provider = discoveryClient.getInstances("provider");
    int index = ThreadLocalRandom.current().nextInt(provider.size());
    String url = provider.get(index).getUri() + "/index";
    return "consumer随机远程调用provier:" + this.restTemplate.getForObject(url, String.class);
}