一、版本锁定
方式一(不推荐):
该方法不利于继承。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.8.RELEASE</version>
</parent>
方式二:
推荐,因为该方式可以进行多继承。
<dependencyManagement>
<dependencies>
<!-- 指定当前项目的父项目:spring-boot-dependencies-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.8.RELEASE</version>
<!-- pom 表示当前项目是一个父项目 -->
<type>pom</type>
<!-- import 表示导入当前项目的pom.xml配置-->
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
二、Ribbon配置
1、配置类
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
三、OpenFeign配置
1、OpenFeign基础配置
(1)pom.xml依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2)注解
@EnableDiscoveryClient
让该服务放入注册中心注册并从注册中心获取其他服务。
@EnableDiscoveryClient
@EnableFeignClients
启动OpenFeign的服务
@EnableFeignClients
2、OpenFeign日志的配置
(1)配置类
该配置类应写在启动类内部。写在调用者内部
@Bean
public Logger.Level loggerLevel(){
return Logger.Level.FULL;
}
(2)pom.xml配置
com.wnxy写的是扫描的包和debug写的是打印的等级。写在调用者内部
logging:
level:
com.wnxy: debug
3、OpenFeign其它配置
(1)服务调用者超时配置
feign:
client:
config:
default:
# 连接超时
connectTimeout: 1000
# 业务处理超时
readTimeout: 3000
(2)服务调用者重试配置
该配置写在启动类中。
@Bean
public Retryer feignRetryer() {
return new Retryer.Default();
}
(3)负载均衡
随机负载均衡
@Bean
public IRule rules(){
return new RoundRobinRule();
}
(4)其他配置
cinema-member-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
OkToRetryOnAllOperations: false # true 对所有请求 get ,post,put ,delete等都进行重试,false 只针对get请求重试。
MaxAutoRetriesNextServer: 1 # 切换实例次数
MaxAutoRetries: 1 #切换实例后重试次数
四、Eureka注册中心
1、Eureka基础配置
(1)父项目
1.pom.xml依赖
<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>
(2)eureka服务端
1.pom.xml依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
2.application.yml配置文件
server:
port: 8761
eureka:
client:
#Eureka客户端向Eureka服务端进行注册的地址。
service-url:
defaultZone: http://localhost:8761/eureka
#不向注册中心注册自己
register-with-eureka: false
#不从注册中心拉取服务
fetch-registry: false
spring:
application:
# 向注册中心进行注册的服务名称
name: eureka-server
3.注解
启动类上写这个注解开启eureka服务
@EnableEurekaServer
2、Eureka注册认证
(1)注册中心的配置
1.依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.application.yml配置文件
spring:
application:
# 向注册中心进行注册的服务名称
name: eureka-server
security:
user:
name: nie
password: 123456
3.配置类
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/eureka/**");
super.configure(http);
}
}
(2)服务端的配置
1.application.yml配置文件
@前面的nie:123456是你写的密码
eureka:
client:
service-url:
defaultZone: http://nie:123456@localhost:8761/eureka
五、Hystrix降级
1、普通降级
(1)pom.xml依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(2)注解
@EnableCircuitBreaker
写在启动类上,开启熔断机制。
@EnableCircuitBreaker
@DefaultProperties(defaultFallback = "errorFallback")
写在业务类上,调用熔断方法,defaultFallback = "errorFallback"便是熔断方法。
@DefaultProperties(defaultFallback = "errorFallback")
@HystrixCommand
该注解写在需要使用熔断的方法上,以便进行熔断。
@HystrixCommand
(3)application.yml配置文件
feign:
hystrix:
enabled: true
(4)降级方法
@RestController
@RequestMapping("portal/fegin")
@Slf4j
@DefaultProperties(defaultFallback = "errorFallback") // 指定降级方法
public class PortalOpenFeginController {
@Autowired
private MemberFeignClient memberFeignClient;
@GetMapping("member/{mid}")
public String findMemberById(@PathVariable("mid")String mid) {
return memberFeignClient.findOne(mid);
}
@GetMapping("timeout") // 超时报错方法,也是访问方法
@HystrixCommand // 熔断降级注解
public String findTimeout() {
return memberFeignClient.findFeginTimeout();
}
// 降级方法,返回string
public String errorFallback(){
return "默认降级方法";
}
}
2、接口降级
(1)编写回调方法
@Component
public class MemberFeignFallback implements MemberFeignClient{
@Override
public String findOne(String mid) {
return "根据id查询出现异常,此时服务降级,调用降级方法,id:"+mid;
}
@Override
public String findFeginTimeout() {
return "超时异常,进行服务降级,调用降级方法";
}
}
(2)fegin接口中指定回调
@FeignClient(value = "cinema-member-service",fallback = MemberFeignFallback.class)
public interface MemberFeignClient {}
(3)删除@DefaultProperties、@HystrixCommand
3、熔断
(1)注解
@HystrixCommand
该注解定义了熔断中的许多属性。
@HystrixCommand(fallbackMethod = "errorFallback",commandProperties = {
// 是否开启断路器
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"),
// 请求错误率大于 50% 就启动熔断器
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "50"),
// 默认10秒内访问接口失败达到20次,打开断路器,触发熔断; 为了方便测试,这里修改10秒内错误达到10次触发熔断。
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "10"),
//断路多久以后开始尝试是否恢复,默认5s
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "10000")
})
(2)完整熔断类
@GetMapping("find/{id}")
@HystrixCommand(fallbackMethod = "errorFallback",commandProperties = {
// 是否开启断路器
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"),
// 请求错误率大于 50% 就启动熔断器
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "50"),
// 默认10秒内访问接口失败达到20次,打开断路器,触发熔断; 为了方便测试,这里修改10秒内错误达到10次触发熔断。
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "10"),
//断路多久以后开始尝试是否恢复,默认5s
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "10000")
})
public String findMemberById(@PathVariable("id")Integer id) {
if (id<0) {
throw new RuntimeException("id不能为负数");
}
return Thread.currentThread().getName() + " 调用成功";
}
// 默认降级方法,返回string
public String errorFallback(@PathVariable("mid")Integer mid){
return "默认降级方法";
}
4、服务监控
(1)监控端
1.创建监控项目
2.pom.xml依赖
<dependencies>
<!--配置hystrix dashboard-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
</dependencies>
3.application.yml配置文件
server:
port: 9002
hystrix:
dashboard:
proxy-stream-allow-list: "*"
4.启动类
@SpringBootApplication
@EnableHystrixDashboard
public class HystrixApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class, args);
}
}
(2)服务端
1.pom.xml依赖
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-metrics-event-stream</artifactId>
</dependency>
2.配置类
该配置类写在启动类上
@Bean
public ServletRegistrationBean getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
3.访问hystrix监控中心
六、网关
1、路由配置
(1)pom.xml依赖
因为网关需要在eureka中进行注册,因此既需要eureka客户端的依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
(2)application.yml配置文件
server:
port: 10000
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: api-member-service
uri: http://localhost:9000
predicates:
- Path=/member/**
eureka:
client:
service-url:
defaultZone: http://jet:123@localhost:8761/eureka,http://jet:123@localhost:8762/eureka
2、断言配置
(1)application.yml配置文件
方法断言
server:
port: 1000
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: api-member-service
uri: http://localhost:9000
predicates:
- Method=get
时间 断言
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: api-member-service
uri: http://localhost:9000
predicates:
- After=2022-06-30T14:15:00+08:00[Asia/Shanghai]
权重断言
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: api-member-high
uri: http://localhost:8999
predicates:
- Weight=group1,8
- id: api-member-low
uri: http://localhost:9000
predicates:
- Weight=group1,2
3、动态路由配置
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: api-member-high
uri: lb://cinema-member-service
predicates:
- Path=/member/**
4、过滤器配置
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: api-member-high
uri: lb://cinema-member-service
predicates:
- Method=get
filters:
- PrefixPath=/member
5、网关集成Hystrix降级熔断
(1)pom.xml依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(2)降级类
@RestController
public class FallbackController {
@GetMapping("/fallback")
public Map<String,Object> fallback(){
Map<String,Object> map = new HashMap<>();
map.put("code",500);
map.put("message","服务不可用");
return map;
}
}
(3)application.yml配置文件
此处fallbackUri: forward:/fallback中forward后面的配置要和上面@GetMapping里面的值相同。而name: fallbackcmd是写死的不能进行更改。
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: api-member-high
uri: lb://cinema-member-service
predicates:
- Path=/member-service/**
filters:
- StripPrefix=1
- name: Hystrix
args:
name: fallbackcmd
fallbackUri: forward:/fallback
6、超时降级配置
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: api-member-high
uri: lb://cinema-member-service
predicates:
- Path=/member-service/**
filters:
- StripPrefix=1
- name: Hystrix
args:
name: fallbackcmd
fallbackUri: forward:/fallback
httpclient:
connect-timeout: 1000 # 建立连接的超时时间
response-timeout: 5000 # 响应的超时时间(处理业务的超时时间)
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000 # hystrix线程隔离超时时间,默认是1秒
7、Gateway 限流
(1)pom.xml依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
(2)配置类
@Configuration
public class RatelimitConfig {
/**
* 根据IP限流,即以每秒内请求数按IP分组统计,超出限流的url请求都将返回429状态
*/
@Bean
public KeyResolver ipKeyResolver(){
return new KeyResolver() {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
//获取请求的IP地址
String hostName = exchange.getRequest().getRemoteAddress().getHostName();
//创建Mono发布者对象,发布数据源
return Mono.just(hostName);
}
};
}
}
(3)application.yml配置文件
注意:这里的key-resolver: "#{@ipKeyResolver}",中注入的内容需要和上面@Bean中方法名相同。
spring:
application:
name: gateway
redis:
host: localhost
port: 6379
cloud:
gateway:
routes:
- id: api-member-high
uri: lb://cinema-member-service
predicates:
- Path=/member-service/**
filters:
- StripPrefix=1
- name: Hystrix
args:
name: fallbackcmd
fallbackUri: forward:/fallback
- name: RequestRateLimiter #限流过滤器
args:
#每秒补充1个,令牌桶每秒填充平均速率, 允许用户每秒处理多少个请求。
redis-rate-limiter.replenishRate: 1
#令牌桶总容量,每秒最大处理的请求数量
redis-rate-limiter.burstCapacity: 3
#限流策略,通过SpEL从容器中获取对象
key-resolver: "#{@ipKeyResolver}"
8、跨域请求
(1)配置类
添加一下配置类即可。
@Configuration
public class CorsFilter {
// 跨域:协议、主机、端口三者有一个不一样,就产生跨域。
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
七、配置中心
配置中心的操作都是基于一下原理图进行操作的,如果对下面的内容有不理解的地方可以看看这张图片就可以理解了。
1、基础配置
(1)配置中心
1.创建git仓库
注意事项:
1、仓库名称需要和服务名称相同
2、配置文件的名称=服务名称-环境名称.yml
2.添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
3.启动类上增加注解
开启配置中心
@EnableConfigServer
开启eureka客户端
@EnableDiscoveryClient
4、配置application.yml文件
server:
port: ${port:8500}
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/q1756336885/{application}
username: 用户名
password: 密码
eureka:
client:
service-url:
defaultZone: http://jet:123@localhost:8761/eureka,http://jet:123@localhost:8762/eureka
(2)客户端
1.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2.新建bootstrap.yml配置文件,并添加配置
spring:
application:
name: cinema-member-service
cloud:
config:
# name: cinema-member-service # 对应的是微服务名称,gitee上的文件名称的一部分
profile: dev # 激活的配置,与上面的name拼接共同构造了完整的配置文件名
label: master # git 上的分支名称
uri: http://localhost:8500,http://localhost:8501 # 配置中心服务端地址,就是config-server地址
2、配置参数刷新
(1)添加依赖(客户端)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(2)配置bootstrap.yml文件
添加如下配置,和spring配置是平行的。
management:
endpoints:
web:
exposure:
include: 'refresh'
(3)添加刷新类
@RestController
@RequestMapping("refresh")
@RefreshScope
public class RefreshController {
@Value("${title}")
private String title;
@GetMapping("/test")
public String test() {
return title;
}
}
(4)发送指令进行刷新
用post方法发送一下请求即可进行更新。
http://localhost:9000/actuator/refresh
3、重试配置
(1)添加依赖(客户端)
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
(2)配置bootstrap.yml文件
spring:
cloud:
config:
label: master #分支名称
uri: http://localhost:8000 #配置中心微服务访问地址
name: order-service #微服务的ID
profile: dev #环境名称
fail-fast: true #快速失败,进行重试
retry:
initial-interval: 5000 #初始间隔时间
max-interval: 30000 #最大间隔时间
max-attempts: 5 # 重试次数
multiplier: 2 #重试间隔时间倍数
八、Nacos
1、配置中心
(1)父项目依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
(2)子项目依赖
<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-config</artifactId>
</dependency>
(3)子项目yml配置
spring:
application:
name: user-service
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
#group: PROD_GROUP
namespace: d0e6b5b6-0240-4373-90df-7da6bacb2571
profiles:
active: dev #配置环境
(4)配置持久化
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://xxx.xx.46.177:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=用户名
db.password.0=密码
2、注册中心
(1)依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
(2)yml配置
spring:
application:
name: user-service
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
namespace: 114a64ad-2756-4642-b60b-f61de4c9d6f3
profiles:
active: prod/test/dev #配置不同环境分别启动
3、网关配置
(1)父项目依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 添加SpringCloud版本锁定 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
(2)网关依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
(3)启动类
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
(5)yml依赖
spring:
application:
name: gateway-server
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: 114a64ad-2756-4642-b60b-f61de4c9d6f3
group: PROD_GROUP
gateway:
routes:
- id: user-service-api
uri: lb://user-service
predicates:
- Path=/us/**
filters:
- StripPrefix=1
server:
port: 9000
(6)负载均衡配置类
@Bean
public IRule loadBalanceRule(){
return new NacosRule();
}
4、持久化实例管理
(1)配置持久实例
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: 114a64ad-2756-4642-b60b-f61de4c9d6f3
group: PROD_GROUP
ephemeral: false # 持久化节点
application:
name: user-service
(2)删除方法
利用postman发送一下请求即可
localhost:8848/nacos/v1/ns/instance?serviceName=user-service&groupName=PROD_GROUP&ip=192.168.3.131&port=8886&clusterName=DEFAULT&namespaceId=57bb4bb9-8f8c-47a9-bffd-9134ad2fbefc&ephemeral=false
5、集群配置
(1)集群配置文件
首先我们进入conf目录下,默认只有一个cluster.conf.example文件,我们需要自行复制一份,修改名称为cluster.conf。每行配置成ip:port。(请配置3个或3个以上节点)
#it is ip
#example
127.0.0.1:8849
127.0.0.1:8851
127.0.0.1:8853
(2)application.properties配置文件
分别修改每个nacos服务的application.properties
配置文件中服务的端口
erver.port=8849/8851/8853
nacos.inetutils.ip-address=127.0.0.1
(3)以集群的方式启动nacos
startup.cmd -m cluster
(4)网关配置
spring:
application:
name: gateway-server
cloud:
nacos:
discovery:
server-addr: localhost:8849,localhost:8851,localhost:8853 # 集群配置
namespace: 114a64ad-2756-4642-b60b-f61de4c9d6f3
group: PROD_GROUP
gateway:
routes:
- id: user-service-api
uri: lb://user-service
predicates:
- Path=/us/**
filters:
- StripPrefix=1
server:
port: 9000
九、Sentinel
(1)基础配置
1.依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.yml配置
server:
port: 8000
spring:
application:
name: sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 注册中心的地址
sentinel:
transport:
dashboard: localhost:8080 # sentinel仪表盘的地址
management:
endpoints:
web:
exposure:
include: '*' #对外暴露的检查项
(2)流量控制
1.链路控制
yml配置
server:
port: 8000
spring:
application:
name: sentinel-service
cloud:
sentinel:
transport:
dashboard: localhost:8080
web-context-unify: false #配置为 false 即可根据不同的URL 进行链路限流
management:
endpoints:
web:
exposure:
include: '*'
链路接口
@RestController
public class HelloController {
@Autowired
private MyServiceImpl myService;
@GetMapping("/check")
public String check(){
return myService.doSomething();
}
@GetMapping("/check1")
public String check1(){
return myService.doSomething();
}
}
(3)降级配置
1.普通方法
@Component
public class UrlBlockHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
String msg = null;
if(e instanceof FlowException){
msg = "接口被限流";
}else if(e instanceof DegradeException){
msg = "接口被熔断,稍后再试";
}else if(e instanceof ParamFlowException){
msg = "热点参数限流";
}else if(e instanceof SystemBlockException){
msg = "系统规则限流";
}else if(e instanceof AuthorityException){
msg = "系统授权限流";
}
httpServletResponse.setStatus(500);
httpServletResponse.setCharacterEncoding("utf-8");
httpServletResponse.setContentType("application/json;charset=utf-8");
ObjectMapper mapper = new ObjectMapper();
Map map = new HashMap<>();
map.put("code",500);
map.put("message",msg);
mapper.writeValue(httpServletResponse.getWriter(),map);
}
}
2.OpenFeign 接口
1、服务提供者
@RestController
@RequestMapping("user")
public class UserController {
@GetMapping("{id}")
public String findUserById(@PathVariable("id") Integer userId){
System.out.println("用户ID:"+userId);
return "用户信息:"+userId;
}
}
2、开发服务消费端
依赖
<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>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
yml
server:
port: 9000
spring:
application:
name: portal-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080
feign:
sentinel:
enabled: true #开启OpenFeign基于Sentinel的限流熔断
启动类
@SpringBootApplication
@EnableFeignClients
public class PortalApplication {
public static void main(String[] args) {
SpringApplication.run(PortalApplication.class, args);
}
}
调用接口
@FeignClient("user-service")
public interface UserFeginClient {
@GetMapping("/user/{id}")
String findUserById(@PathVariable("id") Integer userId);
}
controller层
@RestController
@RequestMapping("/portal")
public class PortalController {
@Autowired
private UserFeginClient userFeginClient;
@GetMapping("{userId}")
public String findOne(@PathVariable("userId") Integer userId) {
return userFeginClient.findUserById(userId);
}
}
降级类
@Component
public class UserFeignClientFallback implements UserFeginClient {
@Override
public String findUserById(Integer userId) {
return "服务降级方法";
}
}
将降级类写在接口上
@FeignClient(value = "user-service",fallback = UserFeignClientFallback.class)
public interface UserFeginClient {
}