关于后端:Spring-Cloud-Alibaba-Nacos-服务注册与发现功能实现

5次阅读

共计 6476 个字符,预计需要花费 17 分钟才能阅读完成。

Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分,它提供了两个重要的性能:服务注册与发现和对立的配置核心性能。

服务注册与发现性能解决了微服务集群中,调用者和服务提供者连贯治理和申请转发的性能,让程序的开发者无需过多的关注服务提供者的稳定性和衰弱水平以及调用地址,因为这些都能够依附 Nacos 进行监测、治理和主动转发。

试想一下,当一个零碎被部署多个之后,如何确定要调用哪一个(服务)实例?当某个被调用的实例呈现问题时,又如何将申请转发到其余实例上?这些问题都是微服务架构中现实存在的问题,然而应用 Nacos 就能够轻松的解决这些问题。并且 Nacos 也提供了对立的配置核心,解决了之前我的项目配置文件寄存在本地或 github 上的安全性问题,并且反对动静批改和对立保护配置文件的性能。

1.Nacos 简介

Nacos 是 Dynamic Naming and Configuration Service 的首字母简称;它是⼀个更易于构建云原生利用的动静服务发现、配置管理和服务治理的平台。

官网:https://nacos.io/

仓库源码:https://github.com/alibaba/nacos

2.Nacos 生态

Nacos 简直反对所有支流语言,其中 Java/Golang/Python 曾经反对 Nacos 2.0 长链接协定,能最大限度施展 Nacos 性能。阿里微服务 DNS(Dubbo+Nacos+Spring-cloud-alibaba/Seata/Sentinel)最佳实际,是 Java 微服务生态最佳解决方案。

3.Nacos 疾速部署

Nacos 反对 3 种部署模式:

  1. 单机部署
  2. 集群部署
  3. 多集群部署

Nacos 装置形式有以下 2 种:

  1. 应用源码装置。
  2. 应用已编译好的安装包进行装置。

本文咱们将应用第一种形式加 Docker,来疾速部署 Nacos 服务器端。

因为 Docker 形式装置和卸载都比拟不便,所以本文就采纳此形式来演示 Nacos 的装置,其余装置形式,详见官网:https://nacos.io/zh-cn/docs/q…

3.1 准备环境筹备

Nacos 依赖 Java 环境来运行,如果您是从代码开始构建并运行 Nacos,还须要为此配置 Maven 环境,请确保是在以下版本环境中装置应用:

  • 64 bit OS,反对 Linux/Unix/Mac/Windows,举荐选用 Linux/Unix/Mac。
  • 64 bit JDK 1.8+。
  • Maven 3.2.x+。

    因为本文应用的是 Nacos + Docker 的形式进行部署的,所以没有装置 Docker 的同学,自行搜寻装置哦。

装置 Open JDK 8

yum -y install java-1.8.0-openjdk-devel.x86_64

装置完之后,应用 java -version 查看是否装置胜利,如下图所示:

若显示具体的 Java 版本则示意装置胜利。

3.2 下载 Nacos

本文应用 git 的形式来下载 Nacos 源码包,所以须要应用以下命令来先装置 git:

yum -y install git

下载 Nacos 源码:

git clone https://github.com/nacos-group/nacos-docker.git

下载实现如下图所示:

进入 Nacos 目录:

cd nacos-docker

3.3 启动 Nacos 服务

Nacos 的运行是须要数据库的,它反对两种数据库:本地数据库 Derby、和 MySQL 数据库。
所以对应的启动命令有以下几种:

  • Derby 数据库运行单机模式:docker-compose -f example/standalone-derby.yaml up
  • MySQL 5.7 数据库运行单机模式:docker-compose -f example/standalone-mysql-5.7.yaml up
  • MySQL 8 数据库运行单机模式:docker-compose -f example/standalone-mysql-8.yaml up

    集群模式启动:docker-compose -f example/cluster-hostname.yaml up

启动胜利如下图所示:

3.3 拜访 Nacos

启动胜利之后,就能够应用 http://127.0.0.1:8848/nacos/#… 来拜访 Nacos 的治理控制台了,如下图所示:

用户名和明码都输出 nacos 就能够进入零碎了,如下图所示:

3.4 常见报错问题

3.4.1 docker-compose 命令未找到

docker-compose 是用于定义和运行多容器 Docker 应用程序的编排工具。应用 docker-compose 后不再须要逐个创立和启动容器。您能够应用 YML 文件来配置应用程序须要的所有服务,而后应用一个命令,就能够从 YML 文件配置中创立并启动所有服务。
然而 docker-compose 须要独自装置,否则会呈现以下谬误:

解决方案:

cd /usr/local/bin
wget https://github.com/docker/compose/releases/download/1.14.0-rc2/docker-compose-Linux-x86_64
rename docker-compose-Linux-x86_64 docker-compose docker-compose-Linux-x86_64
chmod +x /usr/local/bin/docker-compose
docker-compose version

装置胜利如下图所示:

3.4.2 image:invalid reference format

应用 docker-compose 可能会提醒“ERROR: no such image: nacos/nacos-server:: invalid reference format”,有效的参数格局,如下图所示:

解决方案:批改 Nacos 源码中 example/standalone-mysql-5.7.yaml 的配置项,将“image: nacos/nacos-server:{{NACOS_VERSION}}”,批改为:“image: nacos/nacos-server:latest”。

4.Spring Cloud Alibaba 服务注册

服务注册者也就是生产者,是微服务中的服务提供者。它是以 Spring Boot 我的项目为根底创立的,具体操作步骤如下:

创立我的项目应用阿里云的地址 http://start.aliyun.com 来创立 Spring Cloud Alibaba Nacos 我的项目,点击下一步 Next,如下图所示:

减少 Nacos Service Discovery 框架反对,如下图所示:

再增加 Spring Web(Spring MVC)框架的反对,最初点击 Finish 实现我的项目创立。

4.1 我的项目依赖

Spring Cloud Alibaba Nacos 我的项目次要有两个依赖项,如下内容所示:

<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>

4.2 批改配置文件

在配置文件 application.properties 中要填写 Nacos 的相干信息,具体内容如下:

# 利用名称(也是 Nacos 中的服务名)spring.application.name=spring-cloud-nacos-producer
# 应用服务 WEB 拜访端口
server.port=8082
# Nacos 认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=mse-6d50f4f0-p.nacos-ans.mse.aliyuncs.com:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

4.3 增加代码

接下来增加一个 Restful API 的接口,给前面的服务调用者应用,具体实现代码如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

    @RequestMapping("/sayhi/{name}")
    public String sayHi(@PathVariable String name) {return "Hi Nacos Discovery" + name;}
}

编写完代码之后,运行我的项目,察看 Nacos 中的服务列表就能够看到此我的项目,如下图所示:

通过以上操作,咱们创立的 Spring Cloud Alibaba 的我的项目就被注册到 Nacos 中了,其余程序也能够通过 Nacos 对它进行调用了。

5.Spring Cloud Alibaba 服务发现

与下面创立形式相似,接下来咱们再创立一个服务调用者,也叫做消费者来调用下面框架中的 sayhi 办法,具体操作步骤如下。

5.1 创立我的项目


5.2 批改配置文件

# 利用名称
spring.application.name=springcloud-nacos-consumer
# 应用服务 WEB 拜访端口
server.port=8082
# Nacos 帮忙文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos 认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=82.157.146.10:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

5.3 增加代码

消费者的实现代码有两个类,在启动类中增加一个 RestTemplate 的 Bean 对象,用于提供 Restful API 的申请,启动类的具体实现代码如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

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

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

消费者的具体实现代码如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class TestController {
    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/hi")
    public String hi(String name) {
        // 调用生产者 sayhi 办法,并返回后果
        return restTemplate.getForObject("http://spring-cloud-nacos-producer/sayhi/" + name,
                String.class);
    }
}

增加完代码之后,运行程序,在 Nacos 的服务列表中可看到以下内容:

之后拜访消费者的 hi 办法,让其调用生产者的实现成果如下:

从上述后果能够看出,消费者通过 Nacos 曾经胜利的调用到了生产者 spring-cloud-nacos-producer 中的 sayhi 办法了。

小结

Nacos 提供了两个重要的性能:服务注册与发现和对立配置核心的性能,它提供了 3 种部署形式:单机部署、集群部署和多集群部署,以及两种装置形式:源码装置和安装包装置。咱们应用的是 Docker 加 Nacos 源码的形式来装置和部署 Nacos 的。Nacos 服务注册和发现都须要增加 Nacos Service Discovery 框架的反对,且在配置文件中配置相应的 Nacos 信息,才能够正确的实现服务的注册和发现性能。

参考 & 鸣谢

《Nacos 框架与原理》

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java 中文社群

Java 面试合集:gitee.com/mydb/interview

正文完
 0