一、nacos
1、nacos简介
Nacos是阿里巴巴开源的一个对微服务架构中服务发现,配置管理和服务管理平台,由于第一代SpringCloud也就是SpringCloud Netflix很多组件已经进入停更维护模式,所以迫使我们必须要找到一个可以代替Netflix的第二代产品,这时候SpringCloud Alibaba出现了。
Nacos就是注册中心 + 配置中心的结合体
2、nacos下载
请确保远程服务器有以下环境:
jdk1.8+
下载地址:https://github.com/alibaba/nacos/releases,下载2.1.1版本的
上传远程服务
#远程安装地址
/usr/local/nacos-2.1.1
解压
tar -zxvf nacos-server-2.1.1.tar.gz
修改startup.sh
vim /usr/local/nacos-2.1.1/nacos/bin/startup.sh
备注:nacos启动默认集群,改成单机启动。
启动(进去nacos/bin目录下执行)
./startup.sh
这样就安装成功了。
备注:如果启动失败的话,可能是JDK环境未配置好。
查看启动日志:
tail -n 30 /usr/local/nacos-2.1.1/nacos/logs/start.out
备注:这里的访问地址是内网地址,如果是远程服务器需要使用公网ip访问。
http://10.0.0.15:8848/nacos/index.html
3、远程服务器安装nacos
例:腾讯云
(1)、添加腾讯云防火墙规则(8848、9848、9849端口)
(2)、linux服务器开放(8848、9848、9849端口)
firewall-cmd --add-port=8848/tcp --permanent
firewall-cmd --add-port=9848/tcp --permanent
firewall-cmd --add-port=9849/tcp --permanent
#重启防火墙
systemctl restart firewalld
备注:nacos2.x以后的版本需要多开放2个端口,否则后期整合时,无法连接配置中心和服务中心。
4、nacos持久化
(1)、创建naocs数据库
(2)、导入下面位置sql文件
/usr/local/nacos-2.1.1/nacos/conf/nacos-mysql.sql
(3)、更新配置文件
vim /usr/local/nacos-2.1.1/nacos/conf/application.properties
//加入以下内容即可
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456
验证:登录nacos--》权限控制--》用户管理--》添加用户
结果:nacos数据库中users表信息更新。
二、Spring Cloud Alibaba环境搭建
请确保是在以下版本环境中安装使用:
64 bit JDK 17+;下载 & 配置。 17.0.4
Maven 3.2.x+;下载 & 配置。 3.9.2
(1)基于SpringBoot的父maven项目
(2)创建2个服务(生产者和服务者)
1、配置nacos
(1)、创建命名空间
(2)、导入相关配置(也可以自己创建)相关配置内容顶部下载
(2)、自己创建
nacos-provider.yaml
server:
port: 8001
nacos-customer.yml
server:
port: 8002
nacos-gateway.yml
server:
port: 8003
spring:
cloud:
gateway:
discovery:
locator:
enabled: true # 从nacos发现微服务
routes:
- id: nacos-provider # 路由 id,确定唯一加尔肯
uri: lb://nacos-provider # lb 表示从 nacos 中按照名称获取微服务,并遵循负载均衡策略,user-service 对应用户微服务应用名
predicates:
- Path=/hello/**
filters:
- AddRequestParameter=username,zhangsan
- id: nacos-customer
uri: lb://nacos-customer
predicates:
- Path=/customer/**
(3)、结果
备注:nacos-provider.yaml多了个a,验证跟配置格式一致是否能读取。是可以的
2、服务创建
创建NacosDemo服务
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>nacosDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacosDemo</name>
<!-- 打包方式,目的方便子类引用(不写无法引用)不是jar包的话,本身不能当作服务使用-->
<packaging>pom</packaging>
<description>nacosDemo</description>
<properties>
<java.version>17</java.version>
<nacos.version>2.1.1</nacos.version>
<spring-cloud-starter.version>4.0.2</spring-cloud-starter.version>
<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<!--子模块继承后:可锁定版本+不需要输groupId和version -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Nacos 服务注册和发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<!--nacos 配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<!--nacos 连接工具(跟nacos版本一致)-->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
</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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
创建子模块nacos-provider(生产者)
目录如下:
nacos-provider(生产者)application.yml
注: 根据自己的命名空间、dataId、group、服务器公网ip相关填写配置文件。
spring:
# 服务名称
application:
name: nacos-provider
# nacos配置
config:
# cloud大于2021.0.4使用下面 nacos:DataId
import: nacos:nacos-provider.yaml
cloud:
nacos:
username: nacos
password: nacos
# nacos地址 ip:端口
server-addr: 127.0.0.1:8848
# 服务注册
discovery:
# 命名空间
namespace: f82c9413-e463-4bf0-91e3-da2d5a53bdbb
# 组(默认分组可不填)
group: DEFAULT_GROUP
# 配置中心
config:
# 命名空间
namespace: f82c9413-e463-4bf0-91e3-da2d5a53bdbb
# 组(默认分组可不填)
group: DEFAULT_GROUP
nacos-provider(生产者)pom.xml添加web依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
启动类:
@EnableDiscoveryClient
@SpringBootApplication
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
controller层:
@Slf4j
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/say")
public String say(){
return "hello word";
}
}
验证是否加载成功
查看启动日志
查看nacos服务注册
备注:上班摸鱼写博客被网安逮到了,后面nacos采用本地nacos(效果一样)。
三、Fegin远程调用
1、fegin简介
Feign是Netflix开发的声明式子,模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API。
优点
Feign可以做到使用http请求远程服务时就行调用本地方法一样。
2、服务创建
创建子模块nacos-customer(生产者)
创建过程跟nacos-provider(生产者)一样
目录结构如下:
nacosDemo服务pom.xml添加openfeign依赖
<!--feign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring-cloud-starter.version}</version>
<type>pom</type>
</dependency>
nacos-customer(生产者)pom.xml添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--客户端负载均衡器(未配置则项目无法启动)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>4.0.4</version>
</dependency>
</dependencies>
nacos-customer(生产者)application.yml
spring:
# 服务名称
application:
name: nacos-customer
# nacos配置
config:
# cloud大于2021.0.4使用下面 nacos:DataId
import: nacos:nacos-customer.yml
cloud:
nacos:
username: nacos
password: nacos
# nacos地址 ip:端口
server-addr: localhost:8848
# 服务注册
discovery:
# 命名空间
namespace: 48ce0ee5-b942-4c7e-963a-0c44e4e6a555
# 组(默认分组可不填)
group: DEFAULT_GROUP
# 配置中心
config:
# 命名空间
namespace: 48ce0ee5-b942-4c7e-963a-0c44e4e6a555
# 组(默认分组可不填)
group: DEFAULT_GROUP
nacos-customer(生产者)启动类
//feign客户端加载
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class NacosCustomerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosCustomerApplication.class,args);
}
}
nacos-customer(生产者) feignConfig类
@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
nacos-customer(生产者) feign接口类
/**
* value 你要远程连接nacos中注册服务名称
* path 具体路径
*/
@FeignClient(value = "nacos-provider",path = "/hello")
public interface HelloService {
@GetMapping("/say")
String say();
}
nacos-customer(生产者) controller类
@RestController
@RequestMapping("/customer")
public class HelloController {
@Resource
HelloService helloService;
@GetMapping("/say")
public String say(){
System.out.println(helloService.say());
return "helloService.say()";
}
}
验证:启动nacos-provider和nacos-customer->>postman访问nacos-customer接口/idea自带请求接口访问
结果:
四、Sentinel接口管理
1、sentinel简介
Sentinel 具有以下特征:
- 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等
- 完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况
- 广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel
- 完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等
2、sentinel安装
官网下载https://github.com/alibaba/Sentinel/releases
(1)、sentinel启动
java -jar sentinel-dashboard-2.0.0-alpha-preview.jar
(2)、登录
浏览器输入:localhost:8080
,即可访问
账号:sentinel 密码:sentinel
3、项目整合
nacosDemo项目 pom文件添加sentinel版本+依赖
<sentinel.flow.control>2.0.0-alpha</sentinel.flow.control>
<dependencies>
<!--sentinel数据监控+熔断-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<!--sentinel 热点-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-parameter-flow-control</artifactId>
<version>${sentinel.flow.control}</version>
</dependency>
</dependencies>
nacos-provider(生产者) application.yml添加sentinel配置
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080
验证:启动nacos-provider(生产者)->>访问/hello/say ->>登录sentinel查看接口
注:访问接口后sentinel显示相应信息。
结果:
这样就安装成功。
具体使用请看下面文章
五、getway网关
1、网关简介
所谓的网关就是指系统的统一入口,它封装了运用程序的内部结构,为客户端提供统一的服务,一些与业务功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等。
getway处理流程(简化版)
2、项目整合
创建nacos-gateway(网关)服务
创建过程如nacos-provider(生产者)
nacos-gateway(网关)pom.xml添加依赖
<dependencies>
<!--cloud gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>${spring-cloud-starter.version}</version>
</dependency>
<!--cloud gateway 不可缺失,缺失无法通过nacos路由-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>${spring-cloud-starter.version}</version>
</dependency>
</dependencies>
nacos-gateway(网关)application.yml
spring:
# 服务名称
application:
name: nacos-gateway
# nacos配置
config:
# cloud大于2021.0.4使用下面 nacos:DataId
import: nacos:nacos-gateway.yml
cloud:
nacos:
username: nacos
password: nacos
# nacos地址 ip:端口
server-addr: localhost:8848
# 服务注册
discovery:
# 命名空间
namespace: 48ce0ee5-b942-4c7e-963a-0c44e4e6a555
# 组(默认分组可不填)
group: DEFAULT_GROUP
# 配置中心
config:
# 命名空间
namespace: 48ce0ee5-b942-4c7e-963a-0c44e4e6a555
# 组(默认分组可不填)
group: DEFAULT_GROUP
nacos-gateway(网关)启动类
@EnableDiscoveryClient
@SpringBootApplication
public class NacosGateway {
public static void main(String[] args) {
SpringApplication.run(NacosGateway.class,args);
}
}
nacos-gateway(网关)全局过滤器
/**
* 全局过滤处理
*/
@Component
public class LogGlobalFilter implements GlobalFilter, Ordered {
@SneakyThrows
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获取属性中的某个字段
// String token = exchange.getRequest().getQueryParams().getFirst("token");
System.out.println("全局过滤保护中....");
//放行
return chain.filter(exchange);
}
@Override
public int getOrder() {
//全局过滤器优先级 值越小优先级越高
return 0;
}
}
验证:启动三个服务(生产者、消费者、网关)->>访问网关接口/customer/say
结果:
网关断言规则:
predicates:
- Path=/hello/** # 指定路径访问
- After=2023-09-06-15T15:12:13.026+08:00[Asia/Shanghai] # 在此时间之后生效
- Before=2023-09-06-15T15:12:13.026+08:00[Asia/Shanghai] # 在此时间之前生效
- Between=2023-09-06-15T15:12:13.026+08:00[Asia/Shanghai],2023-09-06-15T15:12:13.026+08:00[Asia/Shanghai] # 在此时间之间生效
- Cookie=username,张三 # 只有cookie包含username,且值为张三才生效
- Header=X-request-Id,\d+ # 包含指定请求头,值为数字
- Host=**.zhangsan.com # 指定主机访问
- Method=GET # 指定请求方法访问