自学内容网 自学内容网

java脚手架系列6--openfeign

之所以想写这一系列,是因为之前工作过程中有几次项目是从零开始搭建的,而且项目涉及的内容还不少。在这过程中,遇到了很多棘手的非业务问题,在不断实践过程中慢慢积累出一些基本的实践经验,认为这些与业务无关的基本的实践经验其实可以复刻到其它项目上,在行业内可能称为脚手架,因此决定将此java基础脚手架的搭建总结下来,分享给大家使用。

注意由于框架不同版本改造会有些使用的不同,因此本次系列中主要使用基本框架是 spring-boo-2.3.12.RELEASE和spring-cloud.-Hoxton.SR12,所有代码都在commonFramework项目上:https://github.com/forever1986/commonFramework/tree/master

1. openfeign

在以微服务为基础框架的今天,服务与服务之间的调用司空见惯。以前你调用第三方服务接口的时候,或许可以使用httpclient方式,或者resttemplate方式,但是这些操作都比较繁琐,在微服务时代,诞生了feign。
feign是一个声明式Web服务客户端,它使编写Web服务客户端更加容易。可以让你定义一个接口并通过注解方式,就能调用远程接口,同时还集成负载均衡、连接池、熔断等功能。Feign 最早是由 Netflix 公司进行维护的,后来 Netflix 不再对其进行维护,最终 Feign 由社区进行维护,更名为 Openfeign。

1.1 实践搭建

在真实项目中,其实可以将openfeign作为一个独立的子模块,提供给主要业务使用。下面就以manage-biz访问第三方服务为例,搭建一个openfeign的脚手架。(注意:这里并没有使用微服务的服务注册方式,而是一个简单的http访问
在这里插入图片描述

参考manage-biz、manage-biz-api和business-biz子模块

1)为了更好的演示,我们常见一个子模块business-biz,作为第三方服务。就是一个简单配置,具体参考business-biz代码
2)新建子模块manage-biz-api,将manage-biz需要访问的第三方服务的接口都定义在此,以spring.factories方式发布
3)manage-biz-api子模块的pom文件引入依赖

<!--openFeign-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <exclusions>
        <!-- 排除ribbon负载均衡,使用loadbalancer -->
        <exclusion>
            <artifactId>spring-cloud-netflix-ribbon</artifactId>
            <groupId>org.springframework.cloud</groupId>
        </exclusion>
    </exclusions>
</dependency>
<!--负载均衡器-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

4)在manage-biz-api子模块上,定义一个与business接口一致的feign客户端BusinessFeignClient
5)在manage-biz-api子模块上,定义一个错误回调方法BusinessFallbackFactory,用于如果business-biz服务的business接口无法提供服务时的处理机制
6)在spring.factories上面注册BusinessFallbackFactory
7)在manage-biz子模块上,pom文件引入manage-biz-api子模块
8)在manage-biz子模块上,启动类ManageApplication引入注解@EnableFeignClients(basePackages = {“com.demo.client”}),里面声明feign包地址
9)这样就可以使用BusinessFeignClient调用第三方服务接口

1.2 使用服务注册方式调用

上面2.1的实例中,其实没有通过微服务的服务注册方式访问。下面使用微服务+nacos注册方式,同样的manage-biz访问business-biz服务。

参考manage-biz、manage-biz-api和business-biz子模块

1)首先要要将business-biz子模块注册到nacos,以便服务发现和服务调用

<!-- 引入依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
# 增加nacos配置,服务注册
server:
  port: 9982
spring:
  application:
    name: business-biz-service
  # nacos配置
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # nacos地址
        namespace: manage-biz
        username: manage-biz
        password: manage-biz

2)同样也将manage-biz子模块注册到nacos上面,操作与business-biz一致。

注意namespace命名空间和group分组必须与要访问的business-biz一致

3)在子模块manage-biz-api中新增BusinessByServiceNameFeignClient和回调类BusinessByServiceNameFallbackFactory,注意里面的配置是通过服务名(注意:@FeignClient(value = FeignClientConstant.BUSINESS_BIZ_SERVICE)的value已经配置为服务名)
4)在子模块manage-biz-api中,spring.factories文件中注入BusinessByServiceNameFallbackFactory类
5)在manage-biz子模块的DemoController上面增加一个通过服务名称访问的接口

@SysLog(module= ModuleTypeEnum.MANAGE, description="测试openfeign访问服务名")
@ApiOperation(value = "测试openfeign访问服务名")
@GetMapping("/remote/businessbyservicename")
public Result<String> remoteBusinessByServiceName() {
    return businessByServiceNameFeignClient.business();
}

1.3 高阶功能

前面说得,openfeign为了简化http访问,其实还集成了其它功能,包括负载均衡、连接池、日志等,在搭建脚手架时,最后一次性配置好,后面项目就可以直接使用。

1.3.1 负载均衡

负载均衡是客户端的负载均衡,也就是manage-biz上面做负载均衡,同时也是通过微服务的服务名称调用时才会使用负载均衡。使用openfeign比较低的版本时,默认是使用ribbon作为负载均衡,但是ribbon已经不再维护,因此大多数情况下使用loadbalancer作为负载均衡。使用loadbalancer作为负载均衡有几个点需要注意
1)如果你的spring cloud版本较高,则默认引入loadbalancer
2)如果你的spring cloud版本较低(本案例就是默认引入ribbon的),那么你需要手动引入loadbalancer,同时还需要排除ribbon组件或者在yaml文件中关闭ribbon

参考manage-biz-api

<!--openFeign-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <exclusions>
        <!-- 排除ribbon负载均衡,使用loadbalancer -->
        <exclusion>
            <artifactId>spring-cloud-netflix-ribbon</artifactId>
            <groupId>org.springframework.cloud</groupId>
        </exclusion>
    </exclusions>
</dependency>
<!--负载均衡器-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

1.3.2 连接池

openfeign默认的HTTP请求是HttpURLConnection,而HttpURLConnection不支持连接池。如果你的服务只是偶尔调用,那么是否使用连接池影响不大,但是如果你的服务在频繁,那么使用连接池的好处就会显现出来。
openfeign支持的连接池包括:Apache HttpClient和OKHttp。下面就以OKHttp为例,搭建openfeign的连接池。

参考 manage-biz子模块和manage-biz-api子模块

1)在manage-biz-api子模块的pom中引入okhttp

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
</dependency>

2)在manage-biz的yaml文件中启用okhttp

feign:
  # 开启OKHttp功能
  okhttp:
    enabled: true

1.3.3 熔断处理

openfeign本身集成了hystrix或者sentinel。其中hystrix适合于java和单机情况;而sentinel适合多种语言,并且可以独立部署服务器。因此根据你项目大小和需求,可以设置不同限流
下面以集成hystrix为例:

参考 manage-biz子模块和manage-biz-api子模块

1)在manage-biz的yaml文件中配置开启hystrix

feign:
  hystrix:
    enabled: true

2)写一个BusinessFallbackFactory实现FallbackFactory,这样在重写接口方法里面

package com.demo.client.fallback;

import com.demo.client.BusinessFeignClient;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

@Component
public class BusinessFallbackFactory implements FallbackFactory<BusinessFeignClient> {


    @Override
    public BusinessFeignClient create(Throwable throwable) {
        return new BusinessFeignClient() {

            @Override
            public String business() {
                return "Business服务的Business接口调用失败";
            }
        };
    }
}

1.3.4 日志配置

openfeign的日志级别包括以下几种:

  • NONE:不记录任何日志(默认值)。
  • BASIC:仅记录请求方法和URL以及响应状态码和执行时间。
  • HEADERS:记录基本信息加上请求和响应的头信息。
  • FULL:记录请求和响应的头信息、正文和元数据。

注意:一般日志都是用于调试使用,如果你项目集成logback时,你先要将openfeign的client所在包的日志级别定义为debug
比如该项目中

logging:
 level:
   com.demo.client: debug

配置打印日志一般有2种方式:

通过java代码配置
1)定义一个FeignConfig的类,返回一个Bean,在里面设置日志级别
2)在对于的client,比如BusinessByServiceNameFeignClient,设置configuration = FeignConfig.class

通过yaml文件配置
除了java代码配置之外,也可以使用yaml文件配置

feign:
  client:
    config:
      applicationname: #这个地方改为你的BusinessByServiceNameFeignClient里面value值
        logger-level: full

1.3.5 超时设置

openfeign还需要根据项目情况做一些超时配置

feign:
    client:
        config:
          default:
            #连接超时时间,默认2s
            connect-timeout: 5000
            #请求处理超时时间,默认5s
            read-timeout: 3000

原文地址:https://blog.csdn.net/linwu_2006_2006/article/details/142858694

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!