首先引用 feign 依赖

<!--feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.netflix.feign</groupId>
            <artifactId>feign-okhttp</artifactId>
            <version>8.10.1</version>
        </dependency>
        <!--sentinel-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

其次在yml文件中配置一下 fegin,因为 fegin 是集成了 ribbon 的,所以也配置一下ribbon 下章会写 ribbon 的自定义均衡器

feign:
  sentinel:
    enabled: true                       #开启feign sentinel监控
    
ribbon:
  MaxAutoRetries: 2
  MaxAutoRetriesNextServer: 3
  OkToRetryOnAllOperations: false
  ConnectTimeout: 5000
  ReadTimeout: 6000

在启动类上添加 @EnableFeignClients 注解 这样才会生效

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class TransdataApplication {

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

}

开启 fegin 注解

/**
 * @Author: 
 * @Date: 2019/7/6
 * @Version 1.0
 * 开启 feign 注解
 */
public class MyFeignConfiguration {

	//自定义重试次数
    @Bean
    public Retryer feignRetryer() {
        Retryer retryer = new Retryer.Default(100, 1000, 4);
        return retryer;
    }

}

开始写服务调用的接口了,有很多人不理解 fegin 的这种写法。 @FeignClient 做一个标识,告诉spring容器这里是一个fegin 的客户端。里面的value 即这个客户端是要调用哪个服务用的。configuration 是feigin 的配置。
fallbackFactory 是用来定义熔断器的,就是当被调用服务异常的时候会走这里面。

@GetMapping(value = “/detaineeMain/find”, consumes = “application/x-www-form-urlencoded”) 这个是指向value =“jail-detain” 服务的 /detaineeMain/find 这个方法。findUser 这个是随便取的。

/**
 * 所端微服务接口
 * @author 
 * @version 1.0
 * @date 2019/10/15 11:38
 */
@FeignClient(value ="jail-detain" ,configuration= MyFeignConfiguration.class,fallbackFactory = JailDetainFallback.class)
public interface JailDetainClient {

    //入口参数是json 时consumes 得设置 不然有些会报Content type 'text/plain;charset=UTF-8' not supported 错误
    @GetMapping(value = "/detaineeMain/find", consumes = "application/x-www-form-urlencoded")
    String findUser(@RequestParam Map<String, Object> thisMap);
}

定义fegin 的熔断器,当被调用服务异常时会尽这里

/**
 * @author 
 * @version 1.0
 * @date 2019/10/15 11:38
 */
@Component
public class JailDetainFallback implements FallbackFactory<JailDetainClient> {
  
    Map map = new HashMap<String , String>(){{
        put("code", "0");
        put("msg","jail-detain 服务异常");
    }};

    @Override
    public JailDetainClient create(Throwable cause) {
        return new JailDetainClient() {

            @Override
            public String findUser(Map map) {
                return FastJsonUtils.getBeanToJson(map);
            }
        };
    }
}

好了这样就可以调用了

/**
 * @Author: 
 * @Date: 2019/6/27
 * @Version 1.0
 */
@RestController
public class TestController {
    @Resource
    JailDetainClient jailDetainClient;

    @PostMapping("test111")
    public BasePageResult test(){
        String test = jailDetainClient.findUser(new HashMap());
        return BasePageResultUtil.success(test);
    }
}

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐