springCloud 遇到的一些坑
Fegin
自定义拦截器获取不到request
设置oauth后无法调用 会被权限拦截
这时候需要传递token
所有我们需要一个自定义拦截器 如下:
@Configuration
public class FeignRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
try {
//使用RequestContextHolder工具获取request相关变量
ServletRequestAttributes attributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes();
if(attributes!=null){
//取出request
HttpServletRequest request = attributes.getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
if(name.equals("authorization")){
requestTemplate.header(name, values);
}
}
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
这时候 我们会发现 RequestContextHolder.getRequestAttributes() 为空指针
其实是hystrix隔离级别捣的鬼
我们需要在yml中配置如下:
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
Oauth2 认证
资源服务
释放接口 配置 ResourceServerConfig 必须继承 ResourceServerConfigurerAdapter
而不是继承 WebSecurityConfigurerAdapter
Hystrix 服务熔断
Turbine 监控数据聚合
HTTP收集聚合
POM.xml
在POM.xml中添加以下依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-turbine</artifactId>
</dependency>
启动类
启动类上使用@EnableTurbine
注解开启 Turbine
@EnableTurbine
@SpringBootApplication
public class TurbineApplication {
public static void main(String[] args) {
SpringApplication.run(TurbineApplication.class, args);
}
}
配置文件
在 application.yml 加入 Eureka 和 Turbine 的相关配置
spring:
application:
name: turbine
server:
port: 8080
management:
port: 8081
eureka:
client:
service-url:
defaultZone: http://localhost:7000/eureka/
turbine:
app-config: eureka-consumer-hystrix
cluster-name-expression: new String("default")
combine-host-port: true
参数说明
turbine.app-config
参数指定了需要收集监控信息的服务名;turbine.cluster-name-expression
参数指定了集群名称为default
,当我们服务数量非常多的时候,可以启动多个 Turbine 服务来构建不同的聚合集群,而该参数可以用来区分这些不同的聚合集群,同时该参数值可以在 Hystrix 仪表盘中用来定位不同的聚合集群,只需要在 Hystrix Stream 的 URL 中通过 cluster 参数来指定;turbine.combine-host-port
参数设置为true
,可以让同一主机上的服务通过主机名与端口号的组合来进行区分,默认情况下会以 host 来区分不同的服务,这会使得在本地调试的时候,本机上的不同服务聚合成一个服务来统计。
注意:new String("default")
这个一定要用 String 来包一下,否则启动的时候会抛出异常:
Q.E.D.