SpringCloud Alibaba Nacos 服务注册,负载均衡和配置中心
Nacos = Dynamic Naming And Configuration Service = Eureka + Config +Bus
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台
官方文档:https://github.com/alibaba/nacos
中文版本:https://nacos.io/zh-cn/index.html
按步骤,跟我做;
已测试,没报错;
最重要,是细心;
慢慢来,是大神。
所需环境
*** maven
*** jdk1.8+
Nacos安装
1、点击https://nacos.io/zh-cn/index.html
2、
这次采用一个低版本1.1.4作为测试,使用其他版本按照官网依赖关系,导入对应Springboot,SpringCloud以及Nacos依赖即可,查看版本说明,传送门:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
3、下载对应安装包,我这里下载Windows版本
4、下载完之后,直接解压即可。
5、运行
第一种方式:通过Ctrl + R,输入cmd,回车,进入命令行控制台,然后通过cd [nacos的bin目录],进入到nacos的bin目录下,
然后再输入startup.cmd,回车。
不出意外,我们就可以看到nacos启动成功了,端口号就是上面的8848默认端口
6、打开nacos客户端
在浏览器直接输入,localhost:8848/nacos即可
至于为什么是8848这个端口号,可能是借用了珠穆朗玛峰的高度值(8848.86米),寓意还是很好的,“勇攀技术最高峰”
7、登录
账号/密码:nacos/nacos
一、Nacos实现服务注册
因为我本人使用的IDE是IntelliJ IDEA,所以我这里就在Idea中进行演示,Eclipse使用者可能目录结构有所不同,不过大概的配置都差不多。
1、建一个父工程
父工程什么都不需要,只需要一个Pom即可,将依赖的版本传递给给子模块。相关依赖和插件配置如下,按需配置即可:
<!--pom.xml-->
<dependencyManagement>
<dependencies>
<!-- spring boot 2.2.2.RELEASE-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 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>
<!--数据库驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!-- maven插件-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.2</version>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
2、在父工程下建一个子Module
(1)pom.xml如下:
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.qzwise.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 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>
<!-- mybatis包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!-- mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- spring-boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 热启动工具,修改代码自动加载-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- lombok工具包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- test测试包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
(2)在resources目录下,创建applciation.yml,配置如下
server:
port: 9001
spring:
application:
name: cloud-nacos-provider9001
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos地址
# 配置actuator暴露的端点
management:
endpoints:
web:
exposure:
include: "*" # * 表示暴露所有端点
(3)创建一个主启动类,其内容如下:
package com.springcloud.alibabaNacos;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class CloudNacosMain9001 {
public static void main(String[] args) {
SpringApplication.run(CloudNacosMain9001.class, args);
}
}
(4)写一个简单的controller进行测试
package com.springcloud.alibaba.alibabaNacos.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Long
* @create 2022-01-06 20:34
*/
@RestController
@RequestMapping("/provider")
public class NacosController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/nacos")
public String getNacosMsg() {
return "Nacos Server Registry,Port:" + serverPort;
}
}
(5)运行我们的项目
(6)测试
在浏览器输入localhost:9001/provider/nacos即可看到成功显示
然后我们打开nacos客户端,也可以看到我们的服务已经注册到nacos中
二、Nacos实现负载均衡
为了体现nacos的负载均衡能力,我们必须多建几个服务,微服务名称一样,来组成集群,通过nacos自带的ribbon来达到负载均衡的目的。
这里我们可以直接将上面已经建好的模块,再建一个跟他一模一样的,pom,controller都一样,唯一不同的是yml中的端口号我们换一个
两个服务都建好之后,都启动起来,然后打开nacos客户端,我们可以看到
有两个服务名一样的实例,那么怎么测试调用这个服务,能达到负载均衡效果呢?
我们不妨再创建一个消费者服务,来调用这两个服务提供者实例
1、再建一个模块
2、pom.xml
<dependencies>
<!-- open-feign组件,可以简化封装我们的http调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- nacos服务注册-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- actuator组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 热启动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- lombok组件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- test组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3、application.yml
server:
port: 83
spring:
application:
name: cloud-consumer-nacos-order83
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos地址
service-url:
nacos-user-service: http://cloud-nacos-provider # 将调用服务的地址放在配置文件中,来达到与代码解耦的目的
4、主启动类
package com.springcloud.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author Long
* @create 2022-01-06 20:43
*/
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerMain83 {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerMain83.class, args);
}
}
5、因为需要调用另一个服务,我们需要单独写个配置类,注入RestTemplate
package com.springcloud.alibaba.config;
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;
/**
- @author Long
- @create 2022-01-06 20:47
*/
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
这个类需要在Spring能扫描的地方,如下:
主启动类在这个包的根目录,所以在这个包下,同级或者子包下Spring都能扫描到
6、建一个简单的controller,来调用服务提供者的接口
package com.springcloud.alibaba.controller;
import org.springframework.beans.factory.annotation.Value;
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 javax.annotation.Resource;
/**
* @author Long
* @create 2022-01-06 20:49
*/
@RestController
@RequestMapping("/order")
public class OrderNacosController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String SERVER_URL;
@GetMapping("/nacos")
public String paymentInfo() {
return restTemplate.getForObject(SERVER_URL + "/provider/nacos", String.class);
}
}
7、建好之后,启动该消费者服务
(1)看nacos客户端
可以看到,服务消费者和服务提供者的实例都已经注册到nacos了
(2)打开浏览器,输入http://localhost:83/order/nacos,访问消费者接口
可以看到,成功通过消费者服务调用到了服务提供者,并且可以看到调用的是端口为9001那个实例。当我们再刷新一下,又可以看到,调用的的9002那个实例。
因为nacos自带的ribbon,默认的负载均衡规则是轮询,就是有同一个服务名称的多个实例,会循环调用
三、Nacos实现配置中心
这里我们再创建一个模块,来完成config配置
1、新建一个module,pom.xml如下:
<dependencies>
<!--nacos 配置中心支持-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- open-feign组件,可以简化封装我们的http调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- nacos服务注册-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- actuator组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 热启动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- lombok组件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- test组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2、bootstrap.yml和application.yml
# boostrap.yml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 服务注册地址,nacos地址
config:
server-addr: localhost:8848 # nacos配置中心地址
file-extension: yaml # 其实yml全称就是yaml,所以这里配置它的全称yaml,指定yaml格式的配置
# application.yml
spring:
profiles:
active: dev # 启用开发环境配置
这里做个扩展:
nacos通springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,读取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级顺序的,bootstrap.yml优先级高于application.yml
*** 我们可以将全局通用配置放在bootstrap.yml中,个性化配置放在application.yml
3、主启动类
package com.springcloud.nacosconfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
- @author Long
- @create 2022-01-06 21:41
*/
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigMain3377.class, args);
}
}
4、写一个简单的controller,用来读取在nacos客户端配置的信息
package com.springcloud.nacosconfig.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
-
@author Long
-
@create 2022-01-06 21:51
*/
@RestController
@RefreshScope //提供nacos的动态刷新功能
@RequestMapping("/config")
public class ConfigClientController {
// 读取从nacos客户端配置的信息
@Value("${config.info}")
private String configInfo;@GetMapping("/info")
public String getConfigInfo() {
return configInfo;
}
}
5、我们打开nacos客户端
在配置管理-配置列表中,点击+号新增一个配置文件
这里的Data ID是有规则的,按照以下格式来填写
s
p
r
i
n
g
.
a
p
p
l
i
c
a
t
i
o
n
.
n
a
m
e
−
{spring.application.name}-
spring.application.name−{spring.profile.active}.${spring.cloud.nacos.config.file-extension}
spring.application.name:就是上面我们配置的服务名 nacos-config-client
spring.profile.active:这个是我们在application.yml中配置的启用的配置环境名“dev”
spring.cloud.nacos.config.file-extension(文件后缀):就是我们上面写的yaml
其实上面这些都可以根据配置中的节点顺着找到
所以我们把这三部分拼起来,我们这里的Data ID就是:nacos-config-client-dev.yaml
填完之后,点击发布,返回,我们就可以看到配置文件已经加上去了
6、配置完成之后,启动我们的配置服务
打开浏览器,输入http://localhost:3377/config/info访问刚才服务的接口,就可以看到接口中成功读取到我们在nacos配置中心里面的内容了
至此,nacos 服务注册,负载均衡以及配置中心大致功能就完成了
这里所有的演示,都是用的最简化的方式来进行,如果需要,可以对其中的一些配置,依赖按需进行完善。
希望大家点赞转发,有任何问题,欢迎大家踊跃留言!