首页 > 经验记录 > Spring Cloud Alibaba 使用上 Feign+Sentinel 完成熔断

Spring Cloud Alibaba 使用上 Feign+Sentinel 完成熔断

说起Feign,那又是老东西了啊
我以前写Netfilx的时候就详细讲过Feign这玩意,其实用起来基本是一样的。
以前的文章地址 : 分布式微服务项目如何使用 Feign 实现声明式 REST 调用,以及自定义 Feign 配置
 
虽说切换到了Alibaba,但是也没啥变化,Feign该怎么用就怎么用,这就不详细说了。主要还是Sentinel
其实Sentinel 和Hystrix在代码里写起来也是一样的
首先肯定是要上pom.xml配置起来。加上对应的依赖。

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

 
接着写个Feign接口

package com.skypyb.provider.feign;
import com.skypyb.provider.fallback.HelloServiceFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * Feign客户端
 * 指定调用 sc-demo-alibaba-provider 的服务
 */
@FeignClient(value = "sc-demo-alibaba-provider",fallback = HelloServiceFallback.class)
public interface NacosHelloFeign {
    @RequestMapping(value = "/provider/hello/{msg}")
    String hello(@PathVariable("msg") String msg);
}

调用的话就是这样子调用:

package com.skypyb.provider.controller;
import com.skypyb.provider.feign.NacosHelloFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RequestMapping("/consumer")
@RestController
public class NacosConsumerController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @Autowired
    private RestTemplate restTemplate;
    @Resource
    private NacosHelloFeign nacosHelloFeign;
    @GetMapping(value = "/hello/{msg}")
    public String hello(@PathVariable("msg") String msg) {
        //使用 LoadBalanceClient 和 RestTemplate 结合的方式来访问
        ServiceInstance serviceInstance = loadBalancerClient.choose("sc-demo-alibaba-provider");
        String url = String.format("http://%s:%s/provider/hello/%s",
                serviceInstance.getHost(), serviceInstance.getPort(), msg);
        return restTemplate.getForObject(url, String.class);
    }
    @GetMapping(value = "/hello/feign/{msg}")
    public String helloFeign(@PathVariable("msg") String msg) {
        return nacosHelloFeign.hello(msg);
    }
}

 
哎,观察我的NacosHelloFeign类,这里可以看到,我这用了一个fallback回退,这个回退指定的就是Sentinel 的实现,其实写起来和特么的Hystrix一模一样。不得不说SpringCloud这一点是真的做得好。

package com.skypyb.provider.fallback;
import com.skypyb.provider.feign.NacosHelloFeign;
import org.springframework.stereotype.Component;
/**
 * 熔断类
 * 要是 Feign 的接口调用失败(或者被快速失败)就会走这个类的方法进行处理
 */
@Component
public class HelloServiceFallback implements NacosHelloFeign {
    @Override
    public String hello(String msg) {
        return "触发熔断机制~";
    }
}

 
当然,配置肯定是得配置的,他也不会直接就给你用了。
Sentinel 虽说是适配了 Feign 组件。但默认是关闭的。需要在配置文件中配置打开它,在配置文件增加以下代码:

feign:
 sentinel:
  enabled: true

 
其实到现在,整个Feign的使用+熔断限流机制就已经配完了。
不过Sentinel 比起Hystrix真正优越的地方还没来呢。
那就是: 控制台
这个控制台功能丰富、UI好看,比Hystrix那是高到不知道哪里去了。
要是用控制台,又不得不下载代码、打包、编译、运行。
 
所幸,我们有神器docker。我在docker hub 上找了个镜像,直接用就可以了,镜像地址:https://hub.docker.com/r/bladex/sentinel-dashboard
直接执以下命令,将sentinel控制台起开绑到8858端口

docker pull bladex/sentinel-dashboard
docker run --name sentinel -d -p 8858:8858 -d bladex/sentinel-dashboard

 
然后自己的yml文件也得改一下,毕竟都上控制台了,也得把自己这个服务给注册进去。
全部的yml文件如下所示:

spring:
  application:
    name: sc-demo-alibaba-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.14:8848 #注册进 nacos
    sentinel:
          transport:
            port: 18081 #这个端口的意思是自己这个服务开个端口和 sentinel 控制台交互
            dashboard: 192.168.1.14:8858 # sentinel 控制台的端口
server:
  port: 8081
feign:
  sentinel:
    enabled: true
management:
  endpoints:
    web:
      exposure:
        include: "*"

可以看到配置里有一个 sentinel.transport.port属性,这个属性的意思是在自己本体这个服务里边,在开个新的端口专门用来和 Sentinel 控制台交互
Sentinel 控制台自身也有,默认端口则是8719
 
到这里就差不多了,所有东西打开,然后就可以访问 http://ip:8858 进入Sentinel 控制台,默认账号密码都是sentinel
有一点还需要注意,那就是为了确保客户端有访问量,Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。意思就是说你一个服务注册进我这来,首先还是看不到的。
你得先经过别人的请求,我才会去监控你,所以在服务刚启动的时候进入Sentinel 控制台找不到自己的服务是很正常的,只要启动时没有报错就不会有问题。
 
 

           


EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00