(Translated by https://www.hiragana.jp/)
camellia/docs/camellia-feign/feign.md at master · netease-im/camellia · GitHub
Skip to content

Latest commit

 

History

History
293 lines (243 loc) · 11.9 KB

feign.md

File metadata and controls

293 lines (243 loc) · 11.9 KB

camellia-feign

かい

camellia-feignふうそうりょうfeign,集成しゅうせいいたcamelliaてき体系たいけいちゅう提供ていきょういち些额外的がいてき能力のうりょく

feature

join camellia-core and open-feign, so your feign-client have this feature:

  • support dynamic route
  • support custom route by request param
  • support custom load balance policy by request param
  • support read-write-separate/double-write
  • support dynamic conf, such like timeout

特性とくせい

  • 支持しじ动态ゆかり,运行支持しじ动态配置はいちしんてきよし规则
  • 支持しじcamellia-coreてき通用つうよう能力のうりょく,如读うつしぶん离、そううつし
  • 支持しじ熔断(集成しゅうせいりょうCamelliaCircuitBreaker)
  • 支持しじfallback(支持しじfallbackfallbackFactory)
  • 支持しじすえ租户id配置はいち不同ふどうてきゆかり使用しよう注解ちゅうかいてき方式ほうしき标识租户id,无侵入しんにゅうせい
  • 支持しじ动态配置はいち包括ほうかつちょう时时间、熔断配置はいち
  • 支持しじ动态识别openFeignspring-cloud-feignてき注解ちゅうかい
  • 支持しじspring-boot-starter,以一键替换spring-cloud-feign

快速かいそく开始

  • さきてい义一个接こう
@CamelliaFeignClient(route = "feign#http://127.0.0.1:8080", fallback = TestFeignServiceFallback.class)
public interface ITestFeignService {

    @RequestMapping(value = "/getUser", method = RequestMethod.POST)
    UserResponse getUser(User user);
}

如上じょじょう,@CamelliaFeignClient 注解ちゅうかいてい义了だま认的ゆかり,以及いち个fallback实现

  • ざい启动类上启动camellia-feign
@SpringBootApplication
@EnableCamelliaFeignClients(basePackages = {"com.netease.nim.camellia.feign.samples"})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}
  • つう过@Autowired注入ちゅうにゅうservice
@RestController
public class TestFeignController {

    @Autowired
    private ITestFeignService testFeignService;
    
    //.....
}

支持しじてきよし种类

#固定こていurl
##支持しじhttp
feign#http://127.0.0.1:8080
##也支持しじhttps
feign#https://www.abc.com

#もと于注さつ中心ちゅうしん
##支持しじhttp
feign-discovery#http://serviceName
##也支持しじhttps
feign-discovery#https://serviceName

此外,みちゆかり以按あきらcamelliaてき标准うつしほう支持しじ读写ぶん离、そううつし

支持しじてき配置はいち

你可以使用しようCamelliaFeignClientFactoryらい动构づくりcamellia-feignきゃく户端(spring-boot-starter内部ないぶ也是调用てきCamelliaFeignClientFactory动注入相いりあい关service)

public class CamelliaFeignClientFactory {

    /**
     * 构造方法ほうほう
     * @param feignEnv いち些全きょくさんすう包括ほうかつcamellia-coreてきいち基本きほんさんすう使用しようちゅうさつ中心ちゅうしん需要じゅようてきdiscovery实现以及对应てき健康けんこう检查方法ほうほう使用しようfallback熔断时过滤异つね类型てきFallbackExceptionChecker
     * @param camelliaApi せっにゅうcamellia-dashboard时需要じゅようほんさんすう
     * @param checkIntervalMillis せっにゅうcamellia-dashboard时的规则检查周期しゅうきだま认5000ms
     * @param feignProps 构造feignきゃく户端时的さんすう包括ほうかつ编解码类がた、异常处理类等
     * @param dynamicOptionGetter 动态配置はいちてきかい调接こう
     */
    public CamelliaFeignClientFactory(CamelliaFeignEnv feignEnv, CamelliaApi camelliaApi, long checkIntervalMillis,
                                      CamelliaFeignProps feignProps, CamelliaFeignDynamicOptionGetter dynamicOptionGetter) {
        this.feignProps = feignProps;
        this.feignEnv = feignEnv;
        this.camelliaApi = camelliaApi;
        this.checkIntervalMillis = checkIntervalMillis;
        this.dynamicOptionGetter = dynamicOptionGetter;
    }

    /**
     * 生成せいせいいち个camellia-feignきゃく户端
     * @param apiType 类型
     * @return きゃく户端实例
     */
    public <T> T getService(Class<T> apiType) {
        //...
    }
    
    /**
     * 生成せいせいいち个camellia-feignきゃく户端
     * @param apiType 类型
     * @param fallback fallback
     * @return きゃく户端实例
     */
    public <T> T getService(Class<T> apiType, T fallback) {
        //...
    }
    
    //.....
}

つう过CamelliaFeignClientFactoryてき构造方法ほうほう以及对外提供ていきょうてきgetService方法ほうほう了解りょうかいいたcamellia-feign提供ていきょうてき基本きほんこうのう
とく别的,camellia-feign提供ていきょう一些动态配置的功能,つう过CamelliaFeignDynamicOptionGetterらい暴露ばくろ,如下:

public interface CamelliaFeignDynamicOptionGetter {

    /**
     * すえbidbgroup获取动态配置はいち
     * @param bid 业务bid
     * @param bgroup 业务bgroup
     * @return DynamicOption
     */
    DynamicOption getDynamicOption(long bid, String bgroup);

    /**
     * すえbid获取DynamicRouteConfGetter
     * @param bid 业务bid
     * @return DynamicRouteConfGetter
     */
    default DynamicRouteConfGetter getDynamicRouteConfGetter(long bid) {
        return null;
    }
}

DynamicOption以动态配置はいちちょう时、熔断とうさんすう,如下:

public class DynamicOption {

    //连接ちょう配置はいち
    private DynamicValueGetter<Long> connectTimeout;
    private DynamicValueGetter<TimeUnit> connectTimeoutUnit;

    //读超时配置はいち
    private DynamicValueGetter<Long> readTimeout;
    private DynamicValueGetter<TimeUnit> readTimeoutUnit;

    //支持しじ重定しげさだむかい
    private DynamicValueGetter<Boolean> followRedirects;

    //开启监控
    private DynamicValueGetter<Boolean> monitorEnable;

    //开启熔断,わかcircuitBreakerConfig为null,则不开启熔断
    private CircuitBreakerConfig circuitBreakerConfig;

    //动态检查feignてき注解ちゅうかい类型,とうぜん支持しじだま注解ちゅうかいspring-mvc注解ちゅうかいだま支持しじ动态监测
    private DynamicContractTypeGetter dynamicContractTypeGetter = new DynamicContractTypeGetter.Default();

    //とうもと于注さつ中心ちゅうしん时,如何いか选择ふく务节てんだま认随つくえ支持しじ哈希以及其他てい义规则,こうのう类似于一个简单的ribbon
    private CamelliaServerSelector<FeignResource> serverSelector = new RandomCamelliaServerSelector<>();
    
    //.....
}

CamelliaFeignClient注解ちゅうかい含义

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface CamelliaFeignClient {

    long bid() default -1;//业务bid,だま认-1,わかよし规则たく给camellia-dashboard,则bid需要じゅようだい于0

    String bgroup() default "default";//业务bgroup

    String route() default "";//如果よしぼつゆうたく给camellia-dashboard,则本字ほんじだん必填

    String[] qualifiers() default {};//仅给camellia-feign-spring-boot-starter使用しよう

    boolean primary() default true;//仅给camellia-feign-spring-boot-starter使用しよう

    //如果使用しようcamellia-feign-spring-boot-starter,则会优先springこう厂取,如果いた,则尝试使用しよう无参构造方法ほうほうけんいち
    //正常せいじょう使用しようCamelliaFeignClientFactoryてき话,则会优先使用しよう传入てきfallback,いや则尝试使用しよう无参构造方法ほうほうけんいち
    Class<?> fallback() default void.class;
    //fallbackFactoryてき优先级高于fallback
    Class<?> fallbackFactory() default void.class;

}

すえ不同ふどうてきまいりすう设置不同ふどうてきよし规则

camellia支持しじすえ请求さんすうちゅうてきぼう个字だんうついた不同ふどうてきbgroup,从而映いた不同ふどうてきゆかり
うえ诉功のう使用しよう时需よう配合はいごう使用しよう@RouteKey注解ちゅうかいDynamicRouteConfGetter动态せっこう

public class User {

    @RouteKey
    private long tenantId;

    @LoadBalanceKey
    private long uid;

    private String name;
    private String ext;
    
    //.....
}

以快そく开始sampleちゅうてきせっこう为例,わが们把せっこうにゅうさんUserちゅうてきtenantIdだん添加てんかりょう@RouteKey注解ちゅうかいずいきさき以定义如DynamicRouteConfGetter动态せっこう

public class SampleDynamicRouteConfGetter implements DynamicRouteConfGetter {

    @Override
    public String bgroup(Object routeKey) {
        if (routeKey == null) return "default";
        if (String.valueOf(routeKey).equals("1")) {
            return "bgroup1";
        } else if (String.valueOf(routeKey).equals("2")) {
            return "bgroup2";
        }
        return "default";
    }
}

かり设bid=1,则上述じょうじゅつてきDynamicRouteConfGetter动态せっこう表示ひょうじ
1)とうUserてきtenantIdだん1时,使用しようbid=1,bgroup=bgroup1てきゆかり如路よしいたあつまりぐん1
2)とうUserてきtenantIdだん2时,使用しようbid=1,bgroup=bgroup2てきゆかり如路よしいたあつまりぐん2
3)其他じょう况,使用しようbid=1,bgroup=defaultてきゆかり如路よしいたあつまりぐん3

すえ不同ふどうてきまいりすう设置不同ふどうてき负载均衡きんこう策略さくりゃく

  • 负载均衡きんこう策略さくりゃくてき含义ゆびざい使用しようちゅうさつ中心ちゅうしん进行节点てき动发现的しきざいどう一个路由规则下,针对个服务节てん如何いかはた请求ぶん发到具体ぐたいぼう个节てん
  • 设置负载均衡きんこう策略さくりゃくてき方法ほうほうどおり过设おけDynamicOptionてきCamelliaServerSelectorさんすうらい实现,だま认是ずいつくえ策略さくりゃく,此外还内おけりょう哈希策略さくりゃく以按需选择
public interface CamelliaServerSelector<T> {
    /**
     *
     * @param list まち选择てき节点れつひょう
     * @param loadBalanceKey 负载均衡きんこうkey
     * @return 具体ぐたい选择哪个节点
     */
    T pick(List<T> list, Object loadBalanceKey);
}

わが们同样以快速かいそく开始てきsample为例,わが们把せっこうにゅうさんUser对象ちゅうてきuidだん添加てんかりょう@LoadBalanceKey注解ちゅうかいかり设我们选择了哈希策略さくりゃく,则相どうuidてき请求总是かい发给どう一个服务节点来处理

关于熔断

camellia-feign集成しゅうせいりょうCamelliaCircuitBreaker,从而拥有熔断能力のうりょく
CamelliaCircuitBreakerどおり过DynamicOptionてきCircuitBreakerConfigらい配置はいち配置はいち以动态修あらため,并且对于不同ふどうてきbid/bgroup以进ぎょう不同ふどうてき配置はいち具体ぐたい配置はいち包括ほうかつ如下:

public class CircuitBreakerConfig {

    //以下いかさんすう一经设置不可修改
    private String name = "camellia-circuit-breaker";//熔断てき别名
    private long statisticSlidingWindowTime = 10 * 1000L;//统计成功せいこうしつ败的すべり动窗こうてき大小だいしょう,单位ms,だま认10s
    private int statisticSlidingWindowBucketSize = 10;//すべり动窗こう分割ぶんかつ为多しょう个bucket,だま认10个

    //以下いかさんすう以动态修あらため
    private DynamicValueGetter<Boolean> enable = () -> true;//启用,わか启用,则不进行しつ败率统计,所有しょゆう请求みやこまこと
    private DynamicValueGetter<Boolean> forceOpen = () -> false;//强制きょうせい开,则所有しょゆう请求まこと
    private DynamicValueGetter<Double> failThresholdPercentage = () -> 0.5;//すべり动窗こう范围ないしつ比例ひれいちょう多少たしょうさわ发熔だんだま认50%
    private DynamicValueGetter<Long> requestVolumeThreshold = () -> 20L;//すべり动窗口内こうないいたりしょう多少たしょう个请もとめざいかいさわ发熔だんだま认20个
    private DynamicValueGetter<Long> singleTestIntervalMillis = () -> 5000L;//とう熔断开的じょう况下,间隔多久たく尝试いちさがせ测(也就はん开)
    private DynamicValueGetter<Boolean> logEnable = () -> true;//开日こころざし主要しゅようしるし熔断じょう态变さら时打しるし
    
    //.....
}

关于fallback

camellia-feign支持しじ为每个service设置fallbackあるものfallbackFactory(ところ谓的fallbackFactoryゆび以针对不同ふどうてき异常类型かえしかい不同ふどうてきfallback对象)
わが们可以在@CamelliaFeignClient注解ちゅうかいちゅう添加てんかfallbackfallbackFactory,如果使用しようspring-boot-starter使用しようcamellia-feign,则fallbackfallbackFactory以通过spring注入ちゅうにゅう整体せいたいてき优先级:

  • spring注入ちゅうにゅうてきfallbackFactory实例
  • spring注入ちゅうにゅうてきfallback实例
  • 尝试使用しよう无参构造方法ほうほうはつはじめ注解ちゅうかいちゅうfallbackFactory实例
  • 尝试使用しよう无参构造方法ほうほうはつはじめ注解ちゅうかいちゅうfallback实例

关于动态さんすう(如超时、熔断)

  • camellia-feign使用しようDynamicValueGetterてき方式ほうしきらい提供ていきょう动态さんすう,你可以自ぎょう实现(如对せっいた你们てき配置はいち中心ちゅうしん
  • camellia-feignだま使用しようDefaultCamelliaFeignDynamicOptionGetterらい获取动态さんすう,此时さんすう实际じょうせい态的
  • 此外,camellia-feign还提供ていきょうりょういち个FileBasedCamelliaFeignDynamicOptionGetter,支持しじ使用しよう本地ほんじ配置はいちぶんけん(properties)らい动态おさむあらためさんすう

关于动态ゆかり

  • 一般いっぱんらい说,你需よう引入camellia-dashboardらい配置はいち发动态的よし配置はいち
  • 此外你也使用しようFileBasedCamelliaApi,从而使用しよう本地ほんじ配置はいちぶんけん(properties)らい拟camellia-dashboard