热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringCloud之——OpenFeign(服务间调用)

SpringCloud之——OpenFeign(服务间调用),Go语言社区,Golang程序员人脉社
简介

OpenFeign 声明性REST客户端:OpenFeign 创建用JAX-RS或Spring MVC注释修饰的接口的动态实现,OpenFeign 是Netflix的一个声明性HTTP客户端,它简化了我们与其他服务交互的方式。

OpenFeign 提供了两个重要标注@FeignClient@EnableFeignClients
@FeignClient 标注用于声明Feign客户端可访问的Web服务。
@EnableFeignClients 标注用于修饰Spring Boot应用的入口类,以通知Spring Boot启动应用时,扫描应用中声明的Feign 客户端可访问的Web服务。

OpenFeign 是通过Eureka调用的组件并做为EurekaClient端一起使用,所以提前启动Eureka 服务,请看上一篇博客

提供者

  • 跟我们之前构建项目一样, 使用idea工具直接创建一个新的SpringBoot项目,在选择依赖的界面勾选Cloud Discovert -> OpenFeign依赖,创建完成后的pom.xml配置文件内容如下:
		
		<dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-openfeignartifactId>
        dependency>
	
		<dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
        dependency>
  • 在主启动类上添加OpenFeign的注解@EnableEurekaClient,如下所示:
@EnableEurekaClient
@SpringBootApplication
public class EurekaClientOneApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientOneApplication.class, args);
    }
}
  • controller接口如下所示:
@RestController
public class TestEurekaController {

    @GetMapping("/test/eureka")
    public String aaa() {
        return "hello world!";
    }

}
  • 配置文件
server:
  port: 8081

spring:
  application:
    name: client-one

  main:
    allow-bean-definition-overriding: true

#服务地址
eureka:
  instance:
    hostname: localhost
    #心跳间隔5s,默认30s。每一个服务配置后,心跳间隔和心跳超时时间会被保存在server端,不同服务的心跳频率可能不同,server端会根据保存的配置来分别探活
    lease-renewal-interval-in-seconds: 5
    #心跳超时时间10s,默认90s。从client端最后一次发出心跳后,达到这个时间没有再次发出心跳,表示服务不可用,将它的实例从注册中心移除
    lease-expiration-duration-in-seconds: 10

  client:
    ##不向注册中心注册自己
#    register-with-eureka: false
    ##取消检索服务
#    fetch-registry: false
    ##注册中心路径,如果有多个eureka server,在这里需要配置其他eureka server的地址,用","进行区分,如"http://address:8888/eureka,http://address:8887/eureka"
    service-url:
      defaultZone: http://localhost:8080/eureka

调用者

新建项目和依赖同上

  • 在主启动类上添加OpenFeign的注解@EnableFeignClients,如下所示:
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OpenFeignClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(OpenFeignClientApplication.class, args);
    }

}
  • 新建一个接口,通过FeignClient调用接口,FeignClient参数值为Eureka注册中心的Application Name@GetMapping是请求服务接口地址。代码和图如下:
@FeignClient("CLIENT-ONE")
public interface RpcService {
	//这里调用无参方法,如果是有参数把提供者暴露接口方法复制过来,把mapping换成完整路径
    @GetMapping("/test/eureka")
    String getRpc();
}
  • 配置文件
server:
  port: 8082

spring:
  application:
    name: client-two

  main:
    allow-bean-definition-overriding: true

#服务地址
eureka:
  instance:
    hostname: localhost
    #心跳间隔5s,默认30s。每一个服务配置后,心跳间隔和心跳超时时间会被保存在server端,不同服务的心跳频率可能不同,server端会根据保存的配置来分别探活
    lease-renewal-interval-in-seconds: 5
    #心跳超时时间10s,默认90s。从client端最后一次发出心跳后,达到这个时间没有再次发出心跳,表示服务不可用,将它的实例从注册中心移除
    lease-expiration-duration-in-seconds: 10

  client:
    ##不向注册中心注册自己
    #    register-with-eureka: false
    ##取消检索服务
    #    fetch-registry: false
    ##注册中心路径,如果有多个eureka server,在这里需要配置其他eureka server的地址,用","进行区分,如"http://address:8888/eureka,http://address:8887/eureka"
    service-url:
      defaultZone: http://localhost:8080/eureka

在这里插入图片描述

运行测试

新建一个Controller代码如下:

@RestController
public class CityController {

    @Autowired
    private RpcService rpcService;

    @GetMapping("/cities")
    public String listCity(){
        String body = rpcService.getRpc();
        return body;
    }
}

在浏览器访问:localhost:8080/cities 得到数据就是Feign调用接口返回数据

加强配置


feign:
  client:
    config:
      default:
        # 连接超时,Feign客户端连接提供者的超时阈值
        connectTimeout: 5000
        # 读超时,从Feign客户端请求发出到接收到提供者响应,这段时间超时阈值
        readTimeout: 3000
      # 设置指定某个服务超时阈值,其优先级要高于全局
      CLIENT-ONE: # 服务名称:spring.application.name
        # readTimeout和connectTimeout需要同时配置,否则不生效
        readTimeout: 5000
        connectTimeout: 3000

# 配置服务路由策略,代码优先于配置
CLIENT-ONE:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

自定义路由策略

定义:CustomRuleBalancer类并实现IRule接口。
功能:传递一组端口,从服务列表中删除这些端口对应服务,对剩余服务进行随机访问。

注解入Bean:

@Bean
    public IRule loadBalancer(){
        return new CustomRuleBalancer(Collections.singletonList(8080));
    }

代码:

public class CustomRuleBalancer implements IRule {

    private ILoadBalancer lb;

    private List<Integer> excludePorts;

    public CustomRuleBalancer() {
    }

    CustomRuleBalancer(List<Integer> excludePorts) {
        this.excludePorts = excludePorts;
    }

    @Override
    public Server choose(Object o) {
        //所有可用的servers
        List<Server> servers = lb.getReachableServers();

        //过滤server
        List<Server> availableServers = getAvailableServers(servers);
        return getAvailableRandomServers(availableServers);
    }

    /**
     * 从所有servers中获得排队端口以外的servers
     *
     * @param servers
     * @return
     */
    private List<Server> getAvailableServers(List<Server> servers) {
        if (CollectionUtils.isEmpty(excludePorts)) {
            return servers;
        }
        return servers.stream()
                .filter(f -> !excludePorts.contains(f.getPort()))
                .collect(Collectors.toList());
    }

    /**
     * 从servers中随机一个
     *
     * @param availableServers
     * @return
     */
    private Server getAvailableRandomServers(List<Server> availableServers) {
        int index = new Random().nextInt(availableServers.size());
        return availableServers.get(index);
    }

    @Override
    public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
        this.lb = iLoadBalancer;
    }

    @Override
    public ILoadBalancer getLoadBalancer() {
        return lb;
    }
}

推荐阅读
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • 本教程详细介绍了如何使用 Spring Boot 创建一个简单的 Hello World 应用程序。适合初学者快速上手。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • ECharts 官方提供了丰富的图表示例,但实际项目中往往需要从后端动态获取数据。本文将详细介绍如何从后端获取数据并将其转换为 ECharts 所需的 JSON 格式,以实现动态饼图的展示。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
author-avatar
翡翠雕刻师李贵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有