凯发k8天生赢家一触即发

spring cloud alibaba 使用 feign sentinel 怎么完成熔断 -凯发k8天生赢家一触即发

2024-01-17

这篇文章主要讲解了“spring cloud alibaba 使用 feign sentinel 怎么完成熔断”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“spring cloud alibaba 使用 feign sentinel 怎么完成熔断”吧!

feign的使用

feign也是网飞开发的,springcloud 使用 feign 非常简单,我下边演示一下:
首先 服务消费者这边肯定需要一个对应的依赖:

compile("org.springframework.cloud:spring-cloud-starter-openfeign")

需要启用feign的话,也得在启动类上面加个注解 @enablefeignclients
然后,创建一个 feign 的接口,像这样子

package com.skypyb.sc.feign;
import com.skypyb.sc.entity.user;
import org.springframework.cloud.openfeign.feignclient;
import org.springframework.web.bind.annotation.pathvariable;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.requestmethod;
@feignclient("sc-demo-microservice-user")
public interface userfeignclient {
 @requestmapping(value = "/user/{id}",method = requestmethod.get)
 public user getuser(@pathvariable("id") long id);
}

@feignclient 注解里边的默认属性,也就是name属性是一个客户端的名字,如果使用了eureka的话,会给他自动解析为 eureka server 服务注册表中的服务。
要是配了ribbon,也会使用默认的负载均衡策略来执行请求。
feign默认使用springmvc的注解声明请求,当然也可以用feign自带的注解。不过没啥必要,还需要配置东西。
 
我上边这个例子写完了,实际使用的话只需要注入该类然后调用对应的方法就完事了。非常简便。

package com.skypyb.sc.controller;
import com.skypyb.sc.entity.user;
import com.skypyb.sc.feign.userfeignclient;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.cloud.client.serviceinstance;
import org.springframework.cloud.client.discovery.discoveryclient;
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 java.util.list;
@restcontroller
@requestmapping("/movie")
public class moviecontroller {
 private logger logger = loggerfactory.getlogger(moviecontroller.class);
 @autowired
 private userfeignclient userfeignclient;
 @getmapping("/user/{id}")
 public user getuser(@pathvariable("id") long id) {
  return userfeignclient.getuser(id);
 }
}

不过有几个点需要注意
在使用@feignclient 声明的feign伪装类中:
使用 @pathvariable 注解,必须加上参数!
get请求无法使用对象作为入参! 要不有多少参数写多少参数(每个都要加@requestparam(“参数名”) 注解),要不就用接受一个map对象,也得加@requestparam
post请求可以接收对象,需要加上@requestbody注解
 
 
feign论使用的话,其实已经差不多了。
但是还有一些相关的操作也比较重要。
 
feign 的请求都是使用的默认配置,我们其实可以实现自己的配置供 feign 使用以实现编码、解码、日志记录、验证 等等等等。
比如我可以这么定义一个配置类:

package com.skypyb.sc.config;
import feign.logger;
import feign.auth.basicauthrequestinterceptor;
import org.springframework.context.annotation.bean;
public class feignconfiguration {
 @bean
 public logger.level feignlog() {
  return logger.level.full;
 }
 /**
  * 使用指定的用户名和密码验证所有请求
  * @return
  */
 @bean
 public basicauthrequestinterceptor basicauthrequestinterceptor(){
  return new basicauthrequestinterceptor("user","614");
 }
}

该类配置了对应的日志记录器,和一个简单的效验,以应对请求的验证。
在对应的feign伪装类中,上边的@feignclient注解改一下,就可以使用自己写的配置:

@feignclient(name = "sc-demo-microservice-user", configuration = feignconfiguration.class)

之所以在 @feignclient 注解中指定配置,是因为我的配置类是没有加 @configuration 注解的,我想要实现细粒度的控制。 推荐这样做。
如果加了@configuration 注解,则 spring 会将其自动解析自动应用到全局,这样子就不方便为每个请求进行细粒度调整。

alibaba的使用

首先肯定是要上pom.xml配置起来。加上对应的依赖。

  
   com.alibaba.cloud
   spring-cloud-starter-alibaba-sentinel
  
  
   org.springframework.cloud
   spring-cloud-starter-openfeign
  

接着写个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 "触发熔断机制~";
 }
}

哎,观察我的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 控制台找不到自己的服务是很正常的,只要启动时没有报错就不会有问题。

感谢各位的阅读,以上就是“spring cloud alibaba 使用 feign sentinel 怎么完成熔断”的内容了,经过本文的学习后,相信大家对spring cloud alibaba 使用 feign sentinel 怎么完成熔断这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是本站,小编将为大家推送更多相关知识点的文章,欢迎关注!

网站地图