SpringCloud Alibaba —— Nacos 服务注册

前文

SpringCloud 简介
java

SpringCloud 版本选型
git

SpringCloud 工程构建
github

SpringCloud —— Eureka 注册中心
web

SpringCloud —— Eureka 集群
算法

SpringCloud —— 服务注册进 Eureka 集群
spring

SpringCloud —— Eureka 自我保护
app

SpringCloud —— SpringCloud Consul 实现服务注册中心
负载均衡

SpringCloud —— 三个注册中心的异同点
框架

SpringCloud —— Ribbon
分布式

SpringCloud —— Ribbon 负载均衡算法

SpringCloud —— OpenFeign

SpringCloud —— Hystrix 简介

SpringCloud —— Hystrix 断路器

SpringCloud —— HystrixDashboard 服务监控

SpringCloud —— Gateway 网关

SpringCloud —— Config 配置中心

SpringCloud —— Sleuth 分布式请求链路跟踪

Nacos 是什么?

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台

简单地说:Nacos 就是注册中心 + 配置中心的结合

等价于 Nacos = Eureka + Config + Bus

Nacos 能干吗?

  • 替代 Eureka 作服务注册中心

  • 替代 Config 作服务配置中心

各类注册中心比较

服务注册发现框架 CAP 模型 控制台管理 社区活跃度
Eureka AP 支持 低(2.X 版本闭源)
Zookeeper CP 不支持
Consul CP 支持
Nacos AP 支持

Nacos 下载启动

Nacos 的下载地址 https://github.com/alibaba/nacos/releases

下载以后解压打开 bin 目录,双击 startup.cmd 便可启动 Nacos
在这里插入图片描述
启动以后会出现 Nacos 的字样
在这里插入图片描述

Nacos 访问

启动以后访问 http://localhost:8848/nacos 便可访问 Nacos 控制台,可是须要先登陆,用户名和密码默认都为 nacos
在这里插入图片描述
登陆以后便可跳转到控制台
在这里插入图片描述

Nacos 做为服务注册中心演示

官方文档

官方文档地址 https://spring.io/projects/spring-cloud-alibaba#learn ,目前当前最新的版本是 2.1.0
在这里插入图片描述
这是 SpringCloud Alibaba 的一个依赖

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.1.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在这里插入图片描述

基于 Nacos 的服务提供者

新建 Module

在这里插入图片描述

POM

这里须要添加两个 POM ,一个是父 POM ,一个是本 POM(固然,若是你只有一个微服务的话那就都添加到一个 POM 就好了)


父 POM 中须要添加如下依赖

<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-alibaba-dependencies</artifactId>
	<version>2.1.0.RELEASE</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>

本 POM(若是你只是想测试 Nacos 服务注册的话直接添加 Nacos 的依赖就好了)

<dependencies>

    <!-- SpringCloud Alibaba Nacos-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- SpringBoot整合Web组件 -->
    <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>
    <!--平常通用jar包配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
</dependencies>

主要是这个依赖
在这里插入图片描述

application.yml

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置地址

# 监控端点所有打开
management:
  endpoints:
    web:
      exposure:
        include: '*'

启动类

记得加上 @EnableDiscoveryClient 注解

package com.java.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/** * @author Woo_home * @create 2020/5/20 11:28 */

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

业务类

简单返回字符串就行

package com.java.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/** * @author Woo_home * @create 2020/5/20 11:29 */

@RestController
public class PaymentController {

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

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "Nacos register, serverPort: " + serverPort + "\t id: " + id;
    }
}

测试

运行启动类
在这里插入图片描述
在这里插入图片描述
刷新一下 Nacos 的控制台界面,点击服务列表选项,能够发现咱们的服务已经注册进来了(这跟 Eureka 是相似的,这里也很少说了),集群数量为 1,实例数为 1 等等
在这里插入图片描述
咱们点击一下详情
在这里插入图片描述
点击详情选项能够详细地查看服务信息
在这里插入图片描述
更多操做这里就不一一展现了,感兴趣的朋友能够本身玩下


若是你想拒绝这个服务注册,你还能够点击删除操做
在这里插入图片描述

新建模块 9002(与 9001 同样的服务提供者)

与模块 9001 同样便可(依赖,配置,代码都是同样便可)


启动 9001 和 9002
在这里插入图片描述

刷新一下 Nacos 控制台,能够发现,如今已经有两个服务了,实例数为 2
在这里插入图片描述
也能够点击详情进去看下
在这里插入图片描述

基于 Nacos 的服务消费者

新建 Module

在这里插入图片描述

POM

老规矩,主要是 nacos 的依赖,其它根据须要添加

<dependencies>

    <!-- SpringCloud Alibaba Nacos-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- SpringBoot整合Web组件 -->
    <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>
    <!--平常通用jar包配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
</dependencies>

application.yml

server:
  port: 83

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置地址

# 消费者将要去访问的微服务名称(注册成功进 Nacos 的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

启动类

跟前两个模块的启动类是同样的

package com.java.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/** * @author Woo_home * @create 2020/5/20 12:26 */

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

配置类

配置类很简单,只须要声明一个 bean 就好了,为何要这个 bean,等会儿会说

package com.java.springcloud.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/** * @author Woo_home * @create 2020/5/20 12:28 */

@Configuration
public class ApplicationContextConfig {

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

业务类

package com.java.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;

/** * @author Woo_home * @create 2020/5/20 12:29 */

@RestController
@Slf4j
public class OrderNacosController {

    @Resource // 写成 @Autowrie 也行,随你喜欢
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @GetMapping(value = "/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id) {
        return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
    }

}

测试

启动三个微服务
在这里插入图片描述
刷新一下 Nacos 控制台,如今已经成功注册三个服务了(两个服务提供者,一个服务消费者)
在这里插入图片描述
访问 http://localhost:83/consumer/payment/nacos/13 测试一下,报错了。。。
在这里插入图片描述
缘由是咱们没有在 RestTemplate 加上 @LoadBalanced 注解,加上就好了
在这里插入图片描述
添加 @LoadBalanced 注解以后启动服务,再次访问 http://localhost:83/consumer/payment/nacos/13 测试下,如今返回的是 9002 端口的服务
在这里插入图片描述
再次刷新一下,如今返回的是 9001 端口的微服务
在这里插入图片描述

为何 Nacos 自带负载均衡?

学过 Ribbon 的朋友会发现(没学过也不要紧,这里有文章能够看下 SpringCloud —— Ribbon),这不是负载均衡么?是的,这是 Nacos 自带的负载均衡,为何 Nacos 会自带负载均衡呢?由于 spring-cloud-starter-alibaba-nacos-discovery 依赖里面添加了 Ribbon 的依赖,也能够说 Nacos 整合了 Ribbon,因此 Nacos 就默认支持了负载均衡
在这里插入图片描述

完整代码已上传至码云 代码下载地址
在这里插入图片描述