云原生微服务实战 Spring Cloud Alibaba 之 Nacos-CSDN博客

前言

Nacos 英文全称为 Dynamic Naming and Configuration Service它是一个开源的、易于使用的、功能强大的配置和发现管理系统由阿里巴巴团队使用 Java 语言开发的开源项目。Nacos 为微服务架构提供了一种简单、灵活、动态的配置管理方案可以支持大规模的分布式系统和云原生应用。它旨在提供动态服务发现、配置管理和服务管理等功能帮助开发者构建易于扩展、动态适应的分布式系统。

1、Nacos 的命名是由 3 部分组成

组成部分全称描述
Nanaming/nameServer即服务注册中心与 Spring Cloud Eureka 的功能类似。
coconfiguration即配置中心与 Spring Cloud Config+Spring Cloud Bus 的功能类似。
sservice即服务表示 Nacos 实现的服务注册中心和配置中心都是以服务为核心的。

1.1、技术升级和替换

前几章节我们介绍了Spring Cloud Netflix套件今天开始我们升级成使用Spring Cloud Alibaba。
Spring Cloud Alibaba 的 Nacos discovery会替换掉Spring Cloud Netflix 的 Eureka。
在这里插入图片描述

1.2、系统架构图

整个电商微服务架构选用Spring Cloud Alibaba套件包括

  • 熔断限流Spring Cloud Alibaba Sentinel
  • 微服务注册中心Nacos Discovery
  • 微服务配置Nacos Discovery Config
  • 微服务调用Nacos Discovery

再加上Spring Cloud组件

  • 负载均衡openFeign
  • 网关Gateway

以及

  • 分库分表Apache ShardingSphere-JDBC
  • 缓存集群(Redis主从)

在这里插入图片描述

2、Nacos两大组件

组件描述功能
Nacos ServerNacos 服务端与 Eureka Server 不同Nacos Server 由阿里巴巴团队使用 Java 语言编写并将 Nacos Server 的下载地址给用户用户只需要直接下载并运行即可。Nacos Server 可以作为服务注册中心帮助 Nacos Client 实现服务的注册与发现。
Nacos Server 可以作为配置中心帮助 Nacos Client 在不重启的情况下实现配置的动态刷新。
Nacos ClientNacos 客户端通常指的是微服务架构中的各个服务由用户自己搭建可以使用多种语言编写。Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-discovery在服务注册中心Nacos Server中实现服务的注册与发现。
Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-config在配置中心Nacos Server中实现配置的动态刷新。

在这里插入图片描述

3、Nacos 实现服务注册与发现的流程如下

3.1、下载软件

从 Nacos 官方提供的下载页面中下载 Nacos Server 并运行。

3.2、服务提供者

Nacos Client 启动时会把服务以服务名spring.application.name的方式注册到服务注册中心Nacos Server

3.3、 服务消费者

  • Nacos Client 启动时也会将自己的服务注册到服务注册中心
  • 服务消费者在注册服务的同时它还会从服务注册中心获取一份服务注册列表信息该列表中包含了所有注册到服务注册中心上的服务的信息包括服务提供者和自身的信息
  • 在获取了服务提供者的信息后服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务。

4、实战应用

4.1、版本兼容说明

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

4.2、Nacos server安装

下载
https://github.com/alibaba/nacos/releases/tag/2.0.4
在这里插入图片描述

4.3、启动nacos

Nacos Server 下各目录说明如下

  • bin用于存放 Nacos 的可执行命令。
  • conf用于存放 Nacos 配置文件。
  • target用于存放 Nacos 应用的 jar 包。
    进入bin目录执行启动命令startup.cmd -m standalone
    http://localhost:8848/nacos
    用户名/密码nacos/nacos

4.4、工程改造

4.4.1、父pom改造

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>2021.0.5</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--spring cloud alibaba 依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2021.0.4.0</version>
		<type>pom</type>
    <scope>import</scope>
</dependency>

4.4.2、服务提供者改造

  • 添加依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2021.0.4.0</version>
</dependency>

  • 添加配置
spring:
  application:
    name: app-provider-service #服务名
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  • 启动类加注解
    @EnableDiscoveryClient
    启动应用查看nacos后台

4.4.3、服务消费者改造

  • 添加依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2021.0.4.0</version>
</dependency>
  • 添加配置
spring:
  application:
    name: app-api-service #服务名
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  #Nacos server 的地址
  • 启动类添加注解
    @EnableDiscoveryClient

4.4.4、 Config配置

创建config文件夹在下面添加LoadBalancedConfig配置

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

@Configuration
public class LoadBalancedConfig {

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

}

4.4.5、调用者实例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.Map;

@RestController
@RequestMapping("/user")
public class UserController {

    private final static String SERVER_URL = "http://localhost:8080";
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getUserName")
    public Map getUserName() {
        String url = SERVER_URL + "/user/getUserName";
        Map map = restTemplate.getForObject(url , Map.class);
        map.put("type" , "caller");
        return map;
    }

}

5、集成openFeign

5.1、修改调用方配置文件

5.1.1、增加springcloud依赖

<dependencyManagement>
    <dependencies>
        <!--spring cloud 依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.5</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--spring cloud alibaba 依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.0.4.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

5.1.2、增加openFeign依赖项

<dependencies>
    <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-openfeign</artifactId>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
</dependencies>

5.2、调用方代码改造

5.2.1、在启动类增加openFeign配置

@EnableFeignClients

5.2.2、新增服务层接口UserService

import com.xxx.common.entity.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "app-provider-service")
public interface UserService {
    @GetMapping("/user/getUserName")
    public User getUserName() ;
}

5.2.3、改造控制层方法

@Autowired
private UserService userService;

@GetMapping("/getUserName")
public Map getUserName() {
    User user = userService.getUserName();
    Map map = new HashMap();
    map.put("code" , 200);
    map.put("data" , user);
    map.put("type" , "caller");
    return map;
}

总结

云原生微服务治理有很多手段但在Java生态里最主流的还是Spring Cloud Alibaba 、Spring Cloud Netflix。
Spring Cloud文章的前部分已经把Spring Cloud Netflix相关组件讲解且实践过了这章我们讲解了Spring Cloud Alibaba的Nacos discovery后续还会继续讲解完Spring Cloud Alibaba其他组件。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring