• Spring-Cloud 学习笔记-(6)Feign


    Spring-Cloud 学习笔记-(6)Feign


    在之前我们使用Ribbon来大大简化了远程调用的代码

    String jsonStr = restTemplate.getForObject("http://user-service/api/v1/user/2", String.class);
    

    如果就学到这里,你可能以后需要编写类似的大量重复代码,格式基本相同,无非参数不一样。有没有更优雅的方式,来对这些代码再次优化呢?

    这就是我们接下来要学的Feign的功能了。

    1、简介

    有道词典的英文解释:

    为什么叫伪装?

    Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。

    项目主页:https://github.com/OpenFeign/feign

    2、快速入门

    2.1、加依赖

    <!-- feign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    

    2.2、启动类

    //OrderApplication类
    
    //把之前的RestTemplate去掉
    @SpringBootApplication
    @EnableCircuitBreaker//开启服务的熔断
    @EnableFeignClients//开启Feign
    public class OrderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class);
        }
    }
    

    2.3、编写UserClient接口

    1545489437752

    package com.bigfly.client;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * 用户服务接口
     */
    @FeignClient("user-service")//标记这是一个fegin的远程调用客户端
    public interface UserClient {
    
        //请求路径
        @RequestMapping("api/v1/user/{user_id}")
        String findUserById(@PathVariable("user_id")int id);
    }
    
    

    2.4、修改调用方法

    
    //OrderServcieImpl类
    
        @Autowired
        private UserClient userClient;
    ....
        @Override
        public Order findById(int userId) {
    		//我们把远程调用通过fegin伪装起来,内部fegin同样帮我们实现了负载均衡
            String jsonStr = userClient.findUserById(userId);
    
            JsonNode jsonNode = JsonUtils.str2JsonNode(jsonStr);
            Order order = new Order();
            order.setOrderName("我是一个订单");
            order.setSerialId(UUID.randomUUID().toString());
            order.setUserName(jsonNode.get("data").get("name").textValue());
            order.setPort(jsonNode.get("data").get("port").textValue());
            return order;
        }
    

    2.5、测试

    1545489700166

    3、负载均衡

    feign底层以及集成了ribbon的依赖了

    也就是说,我们引入的Feign依赖过后,就不需要引入Ribbon的依赖了。application.yml配置依旧可以按照ribbon的方式配置负载均衡策略等信息。

    4、Hystrix支持

    4.1、开启Feign对Hystrix的支持

    #开启feign对hystrix的支持
    feign:
      hystrix:
        enabled: true
    

    4.2、编写UserClient的实现类

    package com.bigfly.fallback;
    
    import com.bigfly.client.UserClient;
    import org.springframework.stereotype.Component;
    /**
    *	作为UserClient调用失败后的执行类
    */
    @Component
    public class UserServiceFallBack implements UserClient {
    	
        @Override
        public String findUserById(int id) {
            return "{"data":{"name":"暂无此人","port":"0000"}}";
        }
    }
    

    4.3、标记失败执行类

    //UserClient类
    
    @FeignClient(value = "user-service",fallback = UserServiceFallBack.class)//标记这是一个fegin的远程调用客户端
    public interface UserClient {
    
        //请求路径
        @RequestMapping("api/v1/user/{user_id}")
        String findUserById(@PathVariable("user_id")int id);
    }
    

    4.4、测试

    关闭user-service 访问http://localhost:8781/api/v1/order/1

  • 相关阅读:
    CNN comprehension
    Gradient Descent
    Various Optimization Algorithms For Training Neural Network
    gerrit workflow
    jenkins job配置脚本化
    Jenkins pipeline jobs隐式传参
    make words counter for image with the help of paddlehub model
    make words counter for image with the help of paddlehub model
    git push and gerrit code review
    image similarity
  • 原文地址:https://www.cnblogs.com/bigfly277/p/10162941.html
Copyright © 2020-2023  润新知