(六)基于fegin实现服务调用、负载均衡

上一篇写到

List<ServiceInstance> instances = discoveryClient.getInstances("service-user-provider-8001");
ServiceInstance instance = instances.get(0);

只是调用第一个微服务

若是A能调用2个以上的微服务则,上述方法则不可取。

将采用ribbon负载均衡,实现调用多个服务

但是编码风格不统一,将使用fegin进行调用微服务,负载均衡

Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。

 

1.pom.xml中加入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.在启动类中加入注解
@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}
3.创建一个接口(ProductClient)
//服务的生成者(被调用者)在注册中心注册的名字
@FeignClient(name = "product-service")
public interface ProductClient {
    //被调用者对应方法的路由(类和方法上的@RequestMapping)
    /**
     * 这里需要注意的两个地方
     * <p>
     * 1、在这里使用的GetMapping注解要和被调用发一致,如果还有问题就用@RequestMapping
     * 2、@PathVariable需要设置value,如果不设置也不能成功启动
   *  注意点   1、路径
     * 2、Http方法必须对应
   * 3、使用requestBody,应该使用@PostMapping
     * 4、多个参数的时候,通过@RequestParam("id") int id)方式调用
     */
    @GetMapping("/api/v1/product/find")
    String findById(@RequestParam(value = "id") int id);
}
4.在需要的地方注入ProductClient   调用其方法
@Service
public class ProductOrderServiceImpl implements ProductOrderService {

    @Autowired
    private ProductClient productClient;
    @Override
    public ProductOrder save(int userId, int productId) {
        //通过Feign 调用返回的是字符串几个使用json转换工具转成对象使用
        String product = productClient.findById(userId);
        JsonNode jsonNode = JsonUtils.stringToNode(product);
        ProductOrder productOrder = new ProductOrder();
        productOrder.setCreateTime(new Date());
        productOrder.setUserId(userId);
        productOrder.setTradeNo(UUID.randomUUID().toString());
        productOrder.setProductName(jsonNode.get("name").toString());
        productOrder.setPrice(Integer.parseInt(jsonNode.get("price").toString()));
        return productOrder;
    }
}

上面完成了,Feign 也就可以用了,如果你要配置集群,测试默认负载策略,和上一篇文章ribbon 一模一样。
因为Feign整合了ribbon 而且上一篇文章对于ribbon配置负载策略的方法对于Feign也有效。

2、超时配置
默认optons readtimeout是60,但是由于hystrix默认是1秒超时,所以默认就是1秒 在调用方yml 文件中加入一下配置(1秒足以,除非项目有要求,不然不需要配置)

feign.httpclient.connection-timeout=2000
feign.httpclient.connection-timer-repeat=2000

 

3、默认使用ribbon的轮询策略

修改消费者配置文件application.properties

#其中“service-order-provider-7001”指明对哪个微服务的调用进行配置,当前配置使用随机策略,修改策略修改最后的类名即可
service-order-provider-7001.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
# 设置连接超时时间,单位ms
ribbon.ConnectTimeout=5000
# 设置读取超时时间,单位ms
ribbon.ReadTimeout=5000
# 对所有操作请求都进行重试
ribbon.OkToRetryOnAllOperations=true
# 切换实例的重试次数
ribbon.MaxAutoRetriesNextServer=2
# 对当前实例的重试次数
ribbon.MaxAutoRetries=1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值