文章目录
1、安装nacos(windows)
nacos官网:https://nacos.io/zh-cn/index.html
下载zip包,解压到任意磁盘目录下,创建数据库nacos,执行nacos-server-2.1.1\nacos\conf目录下的nacos-mysql.sql,nacos默认为集群,如果是单机,需要修改配置文件
双击startup.cmd启动
启动成功后,访问:http://192.168.52.1:8848/nacos
2、新建父工程
1、新建maven项目
2、引入依赖
在这里插入代码片
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring-cloud.version>2021.0.1</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
</properties>
3、新建子工程订单服务(service-order)
1、配置文件,把工程注册到nacos
在这里插入代码片
spring:
application:
name: service-order
cloud:
nacos:
discovery: http://192.168.52.1:8848/
2、添加pom依赖
在这里插入代码片
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
</dependencies>
启动项目后,可以在nacos服务列表查看服务
4、新建子工程-商品服务(service-good)
1、配置文件,把工程注册到nacos
在这里插入代码片
spring:
application:
name: service-good
cloud:
nacos:
discovery: http://192.168.52.1:8848/
2、添加pom依赖
在这里插入代码片
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
</dependencies>
3、启动项目后,可以在nacos服务列表查看服务
5、新建网关服务
5.1 路由转发
1、pom文件
在这里插入代码片
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>service-gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service-gateway</name>
<description>service-gateway</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<!-- spring-cloud网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2、修改配置文件
在这里插入代码片
server:
port: 9092
spring:
application:
name: service-gateway
cloud:
nacos:
discovery: http://192.168.52.1:8848/
gateway:
discovery:
locator:
enabled: true #表明gateway开启服务注册和发现的功能,并且spring cloud gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务
#lower-case-service-id: true #是将请求路径上的服务名配置为小写(因为服务注册的时候,向注册中心注册时将服务名转成大写的了
routes:
- id: service-order #自定义id,无意义但不能重复,最好跟服务名保持一致
uri: http://192.168.52.1:9090 # 注册中心中的服务吗
predicates:
- Path=/order/** # 转发该路径
filters:
- StripPrefix=1 #必须加上StripPrefix=1,否则访问服务时会带上order
#经过gateWay网关时,需要在网关统一配置跨域请求,全部通过
globalcors:
cors-configurations:
'[/**]':
allowed-origins: "*"
allowed-headers: "*"
allow-credentials: true
allowed-methods:
- GET
- POST
- DELETE
- PUT
- OPTION
#spring:
# datasource:
# url: jdbc:mysql://localhost:3306/shopping
# username: root
# password: 123456
# driver-class-name: com.mysql.jdbc.Driver
# main:
# allow-circular-references: true
# redis:
# host: 192.168.52.132
# password: 123456
# port: 6379
# database: 0
#mybatis:
# mapper-locations: classpath:mapper/*.xml
# type-aliases-package: com.example.demo.entity
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#rocketmq:
# #nameservice服务器地址(多个以英文逗号隔开)
# name-server: 192.168.52.132:9876
# #生产者配置
# producer:
# #组名
# group: anran-producer-group
# #目的地(topic:tag)
# #topic
# topic: anran-topic
# #sync tag(同步消息tag)
# sync-tag: anran-sync-tags
# #async tag(异步消息tag)
# async-tag: anran-async-tags
# #oneway tag(单向消息tag)
测试
1、访问:http://192.168.52.1:9092/order/getUserId
http://192.168.52.1:9092为网关地址,当通过网关时,拦截/order/**,同事路由转发到订单服务http://192.168.52.1:9090/,然后,根据配置规则,去掉order,变成http://192.168.52.1:9090/getUserId(该接口是订单服务的接口)
5.2 网关实现请求参数拦截
1、新建过滤器GlobalFilter
在这里插入代码片
@Component
public class GatewayFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getQueryParams().getFirst("token");
if(StringUtils.isBlank(token)){
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.BAD_GATEWAY);
String re = "token is null";
DataBuffer wrap = response.bufferFactory().wrap(re.getBytes());
return response.writeWith(Mono.just(wrap));
}
return chain.filter(exchange);
}
}
测试:
不带token
带token,可以转发到订单服务
6、sentinel 限流、服务降级、服务熔断
整体的数据流转如下图,Sentinel客户端启动后注册到控制台,控制台配置相应的流控规则,并保存到Nacos,Sentinel客户端从Nacos读取配置的限流规则,从而根据规则对自身服务进行限流。
1、下载sentinel-dashboard.jar
2、启动:
在这里插入代码片
java -Dserver.port=9093 -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=sentinel -Dserver.servlet.session.timeout=7200 -jar sentinel-dashboard.jar
6.1 sentinel 实现限流
给订单服务 /getUserId 接口做限流
1、使订单服务与sentinel服务端通信,添加订单服务sentinel依赖,修改配置文件
在这里插入代码片
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
在这里插入代码片
spring:
application:
name: service-order
cloud:
sentinel:
transport:
dashboard: http://192.168.52.1:9093
eager: true
2、使用注解方式设置接口限流
在这里插入代码片
@SentinelResource(value = "getUserId",blockHandler = "handleException")
@RequestMapping(value = "/getUserId",method = RequestMethod.GET)
public String getUserId() throws InterruptedException {
return "order----------------------";
}
// blockHandler 函数,原方法调用被限流/降级/系统保护的时候调用
public String handleException(BlockException ex) {
return "当前访问人数过多,请稍后再访问!!!!!!";
}
3、在sentinel服务端设置限流规则,value = “getUserId” ,资源名为getUserId,阈值为1表示:1秒内只能接受一个请求
4、测试
6.2 sentinel实现热点key,如秒杀场景
1、sentinel服务端设置热点key规则,参数索引为0表示:第一个参数设置1秒内只能接口一次请求
2、注解方式实现
在这里插入代码片
@SentinelResource(value = "skillGood")
@RequestMapping(value = "/skillGood",method = RequestMethod.GET)
public String skillGood(Long userId){
return "秒杀成功————————————————————";
}
添加全局异常捕获
在这里插入代码片
@RestControllerAdvice
public class GlobleExceptinHandler {
@ResponseBody
@ExceptionHandler(ParamFlowException.class)
public String ParamFlowException(){
return "访问次数频繁,请稍后重试----------";
}
}
测试
7、skywalking 监控平台
7.1 监控接口访问情况
1、官网下载开源包,https://skywalking.apache.org/downloads/,https://archive.apache.org/dist/skywalking/
进入目录apache-skywalking-apm-8.5.0\apache-skywalking-apm-bin\bin,windows启动startup.bat
2、到浏览器访问:http://localhost:9094/,默认为8080端口,可以在目录apache-skywalking-apm-8.5.0\apache-skywalking-apm-bin\webapp 修改端口
3、订单服务集成skywalking
1)idea方式集成,在Configurations下添加vm-option
在这里插入代码片
-javaagent:E:\workspace\springcloud-ali2\apache-skywalking-apm-8.5.0\apache-skywalking-apm-bin\agent\skywalking-agent.jar
-DSW_AGENT_NAME=service-order
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
4、测试,启动订单服务,访问:http://192.168.52.1:9090/getUserId,此时可以在skywalking监控平台看到该接口的监控信息,可以发现接口请求耗时157ms
7.2 自定义接口链路跟踪
1、在订单服务,添加依赖
在这里插入代码片
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.5.0</version>
</dependency>
在业务方法加注解 @Trace
@Tags(@Tag(key = “getUserById”,value = “arg[0]”)),arg[0]表示第一个参数
在这里插入代码片
@Trace
@Tags(@Tag(key = "getUserById",value = "arg[0]"))
public String getUserById(Long userId){
geta();
return "123";
}
private void geta(){
int i = 4/0;
System.out.println(6);
}
测试:
7.3 设置告警规则
进入目录:\apache-skywalking-apm-8.5.0\apache-skywalking-apm-bin\config,修改alarm-settings.yml文件
8 openFeign,服务调用
1、订单服务调用商品服务