精华内容
下载资源
问答
  • fegin

    2021-06-28 17:07:10
    1、Fegin的使用报错若

    1、Fegin的使用报错
    在这里插入图片描述

    展开全文
  • Fegin

    2021-03-15 09:16:27
    Fegin是一个声明式的HTTP调用框架。为什么是声明式的呢,其实在我们开发过程中一般都是声明一个接口,用@FeginClient标识,接口中的方法与调用方Controller保持一致,如参数,SpringMVC注解这样的。Fegin底层的调用...

    Fegin是一个声明式的HTTP调用框架。为什么是声明式的呢,其实在我们开发过程中一般都是声明一个接口,用@FeginClient标识,接口中的方法与调用方Controller保持一致,如参数,SpringMVC注解这样的。Fegin底层的调用方式是基于HTTP的,默认是使用JDK自带的通信框架,一般可以用HttpClient或OkHttp来进行替换Fegin底层的通信方式,引入pom,在yml文件开启即可。@FeginClient有很多参数,如url是指定服务的调用地址({url:https%3A//网页链接),value是服务在注册中心的名称,primary是指定该实现类的优先级,fegin是会自己生成代理类的,且primary默认是true的方式,这样是表明fegin自己生成的子类是优先级最高的,如果我们要自己写实现类,是会报错误的,所以primary是要做调整的。configuration是用来指定配置类的,fegin的配置类可以分为全局配置和局部配置,具备配置就是在@FeignClient参数中指定configuartion即可。Path属性是指定统一前缀的意思。Fegin可以轻而易举的集成ribbon和hystrix,ribbon是一个客户端的负载均衡工具,ribbon内部又集成了eureka注册中心,可以拿到注册中心服务的一些信息,从而进行一些负载算法对服务的调用。Fegin也支持请求压缩,请求数据过大时可以考虑对数据进行压缩,提高数据传输效率。Fegin也支持继承,开发方式controller和fegin接口都实现了同一个接口类,可以减少很多模板代码。fegin默认是不支持文件传输的,如果想要支持文件出传输,需要引入一些其他的依赖,fegin-from fegin-from-spring,并且为该fegin替换SpringFromEncoder编码器,才可以进行feign的文件传输。Fegin的底层其实就是基于动态代理+RestTemplate对我们声明的接口及方法,url+参数拼接,在返回数据的时候可以根据我们声明的返回类型去做转换,如果你的returnType指定为String,就会给你转成String,如果你指定其他实体,fegin也会帮你转换,但前提是合理的情况下,否则就会报错,当然你也可以直接用Fegin提供的Response来接收,然后自己做处理。

    展开全文
  • fegin需要实现类_Fegin

    2020-11-22 23:05:41
    Fegin客户端什么是Fegin,Fegin是一个声明式的Http客户端,它使得写Http客户端变得更简单,使用Fegin只需要创建一个接口并注解,它具有可插拔的注解特性,Nacos很好的兼容了Fegin,默认实现了负载均衡的效果,底层使用了...

    a7860942db9461fc27f8b609a89e56b8.png

    Fegin客户端

    什么是Fegin,Fegin是一个声明式的Http客户端,它使得写Http客户端变得更简单,使用Fegin只需要创建一个接口并注解,它具有可插拔的注解特性,Nacos很好的兼容了Fegin,默认实现了负载均衡的效果,底层使用了HttpClient作为服务框架

    创建项目

    打开之前创建的工程Nacos,目前已经有两个子工程:

    • nacos-provide:服务提供者
    • nacos-consumer:服务消费者(RestTemplate+Ribbon服务调用)

    同样的操作,在Nacos项目下继续创建一个Springboot项目名为nacos-feign,创建时添加OpenFeign的依赖,如图:

    nacos-fegin的pom.xml文件如下:

    <?

    创建RemoteClient接口,来定义OpenFeign要调用的远程服务接口。

    同时通过@FeginClient注解指定被调用方的服务名,通过fallback属性指定RemoteHystrix类,来进行远程调用的熔断和降级处理。

    RemoteClient.java代码如下

    @FeignClient(name = "nacos-provide",fallback = RemoteHystrix.class)
    public interface RemoteClient {
    
        @GetMapping("/helloNacos")
        String helloNacos();
    }
    

    RemoteHystrix.java代码如下

    @Component
    public class RemoteHystrix implements RemoteClient {
        @Override
        public String helloNacos() {
            return "请求超时了";
        }
    }
    

    通过OpenFeign调用远程服务

    在启动类NacosFeignApplication.java中添加注解@EnableDiscoveryClient开启服务注册、添加注解@EnableFeignClients开启OpenFeign,启动类通过OpenFeign调用服务代码如下

    @SpringBootApplication
    @RestController
    @EnableDiscoveryClient
    @EnableFeignClients
    public class NacosFeignApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(NacosFeginApplication.class, args);
        }
    
        @Autowired
        private RemoteClient remoteClient;
    
        @GetMapping("/feign")
        public String test() {
            return remoteClient.helloNacos();
        }
    }
    
    

    添加项目配置文件

    在resourse目录下,添加application.yml配置

    server:
      port: 9529
    
    spring:
      application:
        name: nacos-feign
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
    

    启动测试

    1. 启动项目nacos-provide
    2. 启动项目nacos-feign

    浏览器访问 http://127.0.0.1:9529/feign, 可以看到返回结果与RestTemplate结果无异,但对于编码和操作方式都更加优雅。

    访问nacos-feign的接口 http://127.0.0.1:9529/feign, 可以通过OpenFeign远程调用nacos-provide的接口,返回结果:

    b005028dde2172b785e0b68035ccdd3e.png
    展开全文
  • fegin token

    2021-05-13 17:26:35
    servlet线程中获取token fegin请求是封装进去 < /** * feign配置token */ @Configuration public class FeignRequestInterceptor implements RequestInterceptor { @Override public void apply...

    1.前端token透传

    servlet线程中获取token fegin请求时封装进去 

    /**
     * feign配置token
     */
    @Configuration
    public class FeignRequestInterceptor implements RequestInterceptor {
    
       @Override
       public void apply(RequestTemplate requestTemplate) {
          // 这里可以添加feign请求的全局参数
    
          ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
          if(attributes==null || attributes.getRequest()==null){
             return;
          }
          HttpServletRequest request = attributes.getRequest();
          requestTemplate.header("token", request.getHeader("token"));
          requestTemplate.header("feignClient", "ifaas-community-sec");
       }
    }
    

    2. 拦截403权限异常 根据用户名密码登录缓存token重试 

    @Slf4j
    @Configuration
    public class FeignTokenAutoConfig {
    
        @Autowired
        private AuthorityService authorityService;
    
        @Bean
        public RequestInterceptor requestInterceptor() {
            return template -> {
                if (matchUrl(template.url())) {
                    return;
                }
                template.header("token", authorityService.getCacheToken());
            };
        }
    
        private boolean matchUrl(String url){
            Pattern pattern = Pattern.compile("^*/oauth/token*$");
            Matcher matcher =pattern.matcher(url);
            return matcher.find();
        }
    
        @Bean
        public Retryer retryer() {
            return new Retryer(){
                int tryTimes;
    
                @Override
                public void continueOrPropagate(RetryableException e) {
                    if (this.tryTimes++ >= 1) {
                        throw e;
                    }
                    if (e instanceof MyRetryException && e.getClass().equals(MyRetryException.class)) {
                        return;
                    }
                    throw e;
                }
    
                @Override
                public Retryer clone() {
                    this.tryTimes = 0;
                    return this;
                }
            };
        }
    
        @Bean
        public ErrorDecoder errorDecoder() {
            return (methodKey, response) -> {
                FeignException exception = FeignException.errorStatus(methodKey, response);
                if (response.status() == HttpStatus.UNAUTHORIZED.value()) {
                    authorityService.resetToken();
                    return new MyRetryException( exception.getMessage(), exception, null);
                }
                return exception;
            };
        }
    
        static class MyRetryException extends RetryableException {
            public MyRetryException(String message, Throwable cause, Date retryAfter) {
                super(message, cause,retryAfter);
            }
        }
    }
    

    在需要重试的客户端加配置

    @FeignClient(value ="test", url = "${test.url.prefix}", configuration = FeignTokenAutoConfig.class, fallback = TestClientCall.class)
    

    3.在servlet线程中 另起一个线程  丢失token 为线程池设置taskDecorator

    @Configuration
    @EnableAsync
    @Slf4j
    public class ThreadPoolConfig {
    
        /**
         * 定义线程池大小,默认是是当前核数*2+1
         */
        @Value("${service.thread.num:0}")
        private Integer threadCoreNum;
    
        public static final String ASYNC_EXECUTOR_NAME = "asyncExecutor";
    
        /**
         * 业务线程通用线程池
         * @return
         */
        @Bean(name = ASYNC_EXECUTOR_NAME)
        public ThreadPoolTaskExecutor serviceThreadPoolTaskExecutor() {
            log.info("<<<<<<<<<开始初始化AsyncService线程池");
            if(threadCoreNum==0){
                threadCoreNum = Runtime.getRuntime().availableProcessors() * 2+1;
            }
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            // 核心线程数
            executor.setCorePoolSize(threadCoreNum);
            // 最大线程数
            executor.setMaxPoolSize(500);
            // 任务拒绝处理策略
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            // 子线程名字前缀
            executor.setThreadNamePrefix("AsyncService");
            // 当调用shutdown时,先执行完当前任务
            executor.setWaitForTasksToCompleteOnShutdown(true);
            executor.setTaskDecorator(new ContextCopyingDecorator());
            executor.initialize();
            return executor;
        }
    }
    /**
     * 将请求上下文拷贝到子线程中
     */
    public class ContextCopyingDecorator implements TaskDecorator {
        @Override
        public Runnable decorate(Runnable runnable) {
            RequestAttributes context = RequestContextHolder.currentRequestAttributes();
            return () -> {
                try {
                    RequestContextHolder.setRequestAttributes(context);
                    runnable.run();
                } finally {
                    RequestContextHolder.resetRequestAttributes();
                }
            };
        }
    }

    4.使用threadLocal 跟线程绑定 使用完销毁

    public abstract class CommonThreadPool {
    
        /** 
        * token 
        */
       public static ThreadLocal<String> tokenThreadLocal = new ThreadLocal<>();
    
       /**
        * userInfo 
        */
       private static final ThreadLocal<UserInfo> USER_INFO = new NamedThreadLocal<>("userInfo");
       /**
         * 线程池
         */
       private static ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("service-threadpool-%d").build();
        public static final ExecutorService executorService = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() + 1
             ,2*Runtime.getRuntime().availableProcessors() + 1,10,TimeUnit.MINUTES
             , new LinkedBlockingQueue<>(GlobalConsts.threadBlockingQueue),threadFactory);
    
       /**
        * 等待线程池中单个线程结束
        */
       public static Object waitTillThreadFinish(Future<?> thread) {
          try {
             return thread.get();
          } catch (InterruptedException | ExecutionException e) {
             e.printStackTrace();
          }
          return Optional.ofNullable(null);
       }
    
    
       public static UserInfo getUserInfo() {
          return USER_INFO.get();
       }
       public static void setUserInfo(UserInfo userInfo){
          USER_INFO.set(userInfo);
       }
       public static void removeUserInfo(){
          USER_INFO.remove();
       }
    
    }
    @Configuration
    public class CommonConfigurerAdapter extends WebMvcConfigurerAdapter {
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new SearchContextHandlerInterceptor());
        }
        public static class SearchContextHandlerInterceptor extends HandlerInterceptorAdapter {
            /**
             * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
             */
            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
                //清除userInfo信息
                CommonThreadPool.removeUserInfo();
                //清除token信息
                tokenThreadLocal.remove();
            }
        }
    }

    使用方式

    1.设置跟线程绑定的变量 

     tokenThreadLocal.set("token")  或者 CommonThreadPool.setUserInfo(userInfo)  

    2.取出和线程相关变量使用

    CommonThreadPool.executorService .submit(() -> {

         tokenThreadLocal.get("token") ; 或 getUserInfo();

    });

    3.清除threadLocal变量

    tokenThreadLocal.remove()或CommonThreadPool.removeUserInfo();

    展开全文
  • fegin 踩坑

    2018-10-17 09:16:01
    1:多客户端时,fegin接口抽取到公共jar中,此时,客户端的启动类上需要对该jar中fegin所在的包进行扫描,要在spring和fegin中同时注册,否则启动时会报:“Consider defining a bean of type '******Feign' in your...
  • Ribbon fegin自定义路由规则,公司本地环境共用一个注册中心路由到本地服务,直接把该类放到项目中即可,不用任何配置
  • fegin实现远程demo.zip

    2020-05-26 16:13:04
    用nacos做配置中心和服务注册中心,用fegin实现远程调用服务。 其中login是服务端,fegin是消费端。
  • Fegin的使用

    2020-05-09 17:36:42
    Fegin的使用 Spring Cloud Fegin是什么 Spring Cloud NetFix的微服务都是以HTTP接口的形式暴露的(现在一般都是json),所以可以使用Apache的HttpClient或Spring的RestTemplate去调用 而Fegin是一个使用起来更加...
  • **1,Fegin客户端调用** ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007184346463.png#pic_center) 1.1,订单服务调用 会员服务的接口中的 getMember 会员服务中的接口实现 订单服务中的 API调用...
  • rabbitMQ fegin cloud

    2019-07-23 15:38:58
    问题描述:写了一个接口,然后用到了rabbitMQ,在mq的处理方法中使用到了fegin远程跨服务调用接口,但是一直跨不了服务,一直提示没有权限。 请问该如何配置?
  • Fegin整合Hystrix

    2021-01-27 09:55:25
    因为在fegin中就整合了hystrix,所以第一步要开启fegin中的hystrix,在配置文件中增加 feign: hystrix: enabled: true 然后在启动类上添加注解@EnableCircuitBreaker 增加调用外部服务的接口,添加feginclient ...
  • 微服务 fegin 404

    2019-09-27 11:19:00
    问题一 fegin rpc调用不成功 我模拟搭建了一个订单服务和会员服务。 在两个服务的application.yml 文件中我都添加了服务的上下文路径 模拟订单服务向会员服务获取会员信息。 会员服务 订单服务 依次 启动eureka...
  • Springcloud fegin + oauth2 调用,实现token传递,解决fegin调用 ,无权限问题
  • 1、在使用Fegin的时候,有时候需要自定义配置,如果,某个服务需要加入鉴权,才能进行访问或者需要打印这个调用需要打印DEBUG级别的日志 二、例子 例子1:某个服务需要加入鉴权,如:我们要请求eureka服务的基本信息...
  • fegin注解踩坑

    2020-09-03 20:48:19
    通过fegin调用其他服务的接口(参数带有base64图片字符串),一直给我提示json解析错误。[旺柴][强] 我一直朝着报错的方向去解决,差点把我给拒绝了。 后来找到原因,居然是请求参数大小的限制!! 后来配置 server:...
  • nacos fegin 整合异常

    2021-09-09 18:48:31
    nacos 整合 fegin 异常 版本环境: spring boot 2.5.4 spring cloud 2020.0.3 com.alibaba.cloud 2.2.0.RELEASE 代码内容 Fegin service 定义 @FeignClient(name="cloud-provider") public interface EchoService { ...
  • fegin的日志配置

    2020-11-20 17:12:33
    fegin的日志配置 调试的时候,往往会发现,我调用fegin的方法,但是却总是调用的熔断器的方法,而日志却没有打印出来,导致无从下手。 现在就希望可以打印出fegin的请求参数和请求响应。 默认情况下feign是没有日志...
  • CloudAlibaba-Fegin

    2020-08-07 15:11:58
    之前博主也写了 Fegin的学习笔记. 整理到这一篇里面了
  • 通过2个spring boot服务,实现consul的注册以及通过fegin(服务名)进行微服务直接的调用,实现HystrixCommand的容错处理
  • spring cloud集成fegin

    2021-05-28 16:16:17
    1.服务端不做累述,正常书写 2.消费方 (1)引入pom <dependency> <groupId>org.springframework.cloud</groupId>...spring-cloud-starter-openfeign<...(3)定义fegin接口 @FeignCli
  • fegin的一点理解

    2019-06-13 15:48:00
    fegin 作用于 server 和 server之间,一般写在service层;假设我们的mapper是共用的,那么就有一个问题直接用过引用mapper直接操作DB的方式还是通过fegin方式? 架构层面 其实这里有一个本质区别,如果通过mapper...
  • spring-cloud之fegin

    2020-10-16 10:24:16
    fegin它是用来做微服务之间的服务调用的,在使用fegin的时候直接调用微服务名称,fegin会去注册中心列表获取微服务,在获取到微服务之后,根据rebbion策略进行调用微服务,这边直接做具体实现了。 导入jar: <...
  • SpringCloud Fegin组件

    2021-02-26 09:26:56
    SpringCloud Fegin组件 01、Feign:介绍与使用 在前面的学习中,使用了Ribbon的负载均衡功能,大大简化了远程调用时的代码: // 定义服务实例访问URL String url = "http://user-service/user/" + id; return ...
  • SpringCloud 之 Fegin

    2019-08-16 11:56:39
    SpringCloud 之 Fegin —— 发送GET、POST请求以及文件上传 由于项目需要调用其他微服务的数据,首先想到的就是写一个http网络请求的工具类,但是想到在之前看springCloud的时候里面有这个Fegin可以实现,就顺便实践...
  • Fegin的基本使用

    2020-11-05 20:35:26
    Fegin的基本使用 一,需要搭建两个Spring Boot的服务 服务的提供者 spring-cloud-order-service,服务提供者包含两个模块 1. order-api 这是一个spring Boot的工程,主要是定义接口的规范,并且对外发布 ...
  • springbootdemo springboot2.0+springcloud+eureka+fegin demo springboot分布式项目demo,主要使用了springboot2.0+ springcloud(Finchley.SR1)+eureka+fegin完成一个分布式的微服务项目;
  • 微服务通信-Fegin

    2018-04-30 20:38:49
    创建访问类(name指代服务名称,@GetMapping指代要访问的方法)4.Conroller类中测试--------------Fegin--------------声明式REST客户端(伪RPC),本质还是http客户端-采用了基于接口的注解-内部也自实现了使用Ribbon做...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,314
精华内容 3,325
关键字:

fegin