整合SpringCloudAlibaba----OpenFeign与Sentinel

新建maven工程xxx-search

maven目录结构
  • xxx-search
      • xxx-search-api
        • com.xxx.search.api 接口定义层
          • dto
          • param
          • interfaces
      • xxx-search-service
        • com.xxx.search.service 实现层
          • ApiImpl
          • common
          • domain
      • xxx-search-web
        • com.xxx.search.web 调用层 小前台
          • controller
          • common
          • feign 远程调用
            • fallback 调用失败 兜底方法
          • vo
          • param
添加依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
加注解
  • 启动类添加注解 @EnableDiscoveryClient
添加配置
@Configuration
@RequiredArgsConstructor
public class FeignConfiguration implements RequestInterceptor {
    private final BaseBean baseBean;
    @Bean
    Logger.Level feignLoggerLevel() {
        //这里记录所有,根据实际情况选择合适的日志level
        return Logger.Level.FULL;
    }


    @Override
    public void apply(RequestTemplate template) {
        //请求头 添加服务名字
        template.header("SERVER", baseBean.getName());
    }
}
yml文件配置
ribbon:
  # 设置连接超时时间 单位毫秒   
  ConnectTimeout: 40000  
   # 设置读取超时时间  单位毫秒
  ReadTimeout: 30000  
   # 对所有操作请求都进行重试
  OkToRetryOnAllOperations: false  
  # 对当前实例的重试次数
  #  MaxAutoRetries: 1  
  # 切换实例的重试次数
  MaxAutoRetriesNextServer: 0  
  #获取负载均衡器服务列表缓存 单位毫秒
  ServerListRefreshInterval: 5000  
实现

1.api层定义接口

/**
 * 测试接口
 * @return TestDto
 */
@RequestMapping(value="/test", method= RequestMethod.GET)
R getTestDto();

2.service层实现api接口

@RestController
@RequiredArgsConstructor
@Slf4j
public class TestApiImpl implements TestApi{
	 @Override
    public R getTestDto() {
        return R.ok();
    }
}

3.web层feign调用

feign通过服务名"search-server"调用,必须注册到相同的nacos中

@Component
@FeignClient(value = "search-server",fallbackFactory = FtestApiFallback.class)
public interface FtestApi extends TestApi {
}

兜底的方案 比如限流,熔断

@Component
public class FtestApiFallback implements FallbackFactory<FtestApi> {
        @Override
    public FtestApi create(Throwable throwable) {
        return new FtestApi() {
            @Override
            public R getTestDto() {
                return null;
            }
     }
}

前端接口请求

@RestController
@RequiredArgsConstructor
public class TestController {
    private final FtestApi ftestApi;

    @GetMapping("/test")
    private R getTest(){
        R testDto = ftestApi.getTestDto();
        String ok = R.isOk(testDto, String.class);
        return R.ok(ok);
    }
}

整合Sentinel

  • 演示在service层流控规则和授权规则
添加依赖
        <!-- sentinel Push模式依赖 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.nacos</groupId>
                    <artifactId>nacos-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
添加配置,限流统一返回
@Component
public class MyUrlBlockHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws Exception {
        String msg = null;
        if (ex instanceof FlowException) {
            msg = "限流了";
        } else if (ex instanceof DegradeException) {
            msg = "降级了";
        } else if (ex instanceof ParamFlowException) {
            msg = "热点参数限流";
        } else if (ex instanceof SystemBlockException) {
            msg = "系统规则(负载/...不满足要求)";
        } else if (ex instanceof AuthorityException) {
            msg = "授权规则不通过";
        }
        // http状态码 只能是错误码 才能被调用方feign FallbackFactory拦截到
        response.setStatus(423);
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Type", "application/json;charset=utf-8");
        response.setContentType("application/json;charset=utf-8");
        new ObjectMapper()
                .writeValue(
                        response.getWriter(),
                        R.error(ErrorEnum.SYSTEM_OFTEN.code(),msg)
                );
    }

自定义授权规则
@Configuration
public class RequestOriginParserDefinition implements RequestOriginParser {

    @Override
    public String parseOrigin(HttpServletRequest request) {
        //上游服务名字  上游可以通过feign.RequestInterceptor方法实现
        return request.getHeader("SERVER");
    }
}
yml文件添加
    # 熔断限流
    sentinel:
      transport:
        dashboard: ${wfx.ip}:8080
      #取消控制台懒加载
      eager: true 
      datasource:
       #流控规则
        ds1:                 
          nacos:
            server-addr: ${wfx.ip}:8848
            data-id: ${spring.application.name}-${spring.profiles.active}-flow
            groupId: ${spring.application.name}-group
            data-type: json
            rule-type: flow
        #访问控制规则
        ds2:                  
          nacos:
            server-addr: ${wfx.ip}:8848
            data-id: ${spring.application.name}-${spring.profiles.active}-authority
            groupId: ${spring.application.name}-group
            data-type: json
            rule-type: authority
            
#开启 Feign 对 Sentinel 的支持
feign:
  sentinel:
    enabled: true
在nacos配置管理添加流控配置文件 search-server-dev-flow 格式json
[
    {
    #资源名,即限流规则的作用对象
    "resource": "/test",
   	#来源应用
    "limitApp": "search-web",
    #限流阈值类型,QPS 或线程数
    "grade": 1,
    #限流阈值
    "count": 1,
    #根据调用关系选择策略
    "strategy": 0,
    #流量控制
    "controlBehavior": 0
    }
]
在nacos配置管理添加授权配置文件 search-server-dev-authority 格式json
[
    {
    #资源名,即限流规则的作用对象
    "resource": "/test",
    #来源应用
    "limitApp": "search-web",
    #0白名单1黑名单
    "strategy":"0",
    ##流量控制
    "controlBehavior": 0
    }
]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jOkCQrwl-1625126960645)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20210701160759224.png)]

启动web service

sentinel控制台出现这两种控制在这里插入图片描述
在这里插入图片描述

前端请求/test接口 是web小前台通过feign调用下游service的api接口,下游处理数据,在返回web层,下游限流了,或者授权不通过,都会到web层的FtestApiFallback这个类处理

下期整合SpringCloudAlibaba----Seata

传送门

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值