zoukankan      html  css  js  c++  java
  • Feign客户端的重构,新建springcloud架构

    1,在上篇博文中,已经实现了feign 客户端来远程调用接口的功能,因为feign 客户端在springcloud 开发过程中是比较常用的方式

    https://www.cnblogs.com/pickKnow/p/11385656.html

    2,上一篇博文中的架构,比较简单,直接使用feign 客户端没有重构的话,代码比较冗余。例如,member 服务中调用FeignMember 中的 getOrder 接口,FeignOrder 中的接口的具体实现在order 服务中的getOrder 中来实现

    这样的代码比较冗余,如果有很多方法,就得写好多的接口。。。

    @FeignClient(name = "app-aiyuesheng-order")
    public interface OrderFeign {
    
        @RequestMapping("/getOrder")
        public String getOrder();
    。。。。
    。。。。
    如果有好多接口,这边得写很多,代码很冗余 }

    3,springcloud 项目中,重构feign 客户端

    项目的最终的目录结构

    -----eureka: 单独的项目,eureka 注册中心

    -----springcloud-parents: 父项目,里面是共同的依赖,maven project 的打包类型选择pom

    ----------springcloud-api-service     :子moduel.也是pom 类型,api 接口,没有实现

    ---------------springcloud-api-member-service: 子module:jar 类型,具体的member 的接口

    ---------------springcloud-api-order-service:   子module:jar 类型,具体的order 的接口

    ----------springcloud-api-member-impl-service: 子module,jar 类型,member api 的具体实现

    ----------springcloud-api-order-impl-service: 子module,jar 类型,order api 的具体实现

    第一步:

    springcloud-parents:

    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.1.RELEASE</version>
        </parent>
        <!-- 管理依赖 -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Finchley.M7</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
        <dependencies>
            <!-- SpringBoot整合Web组件 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- SpringBoot整合eureka客户端 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <!-- SpringBoot整合fegnin客户端 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
    
        </dependencies>
        <!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/libs-milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>

    第二步:

    springcloud-api-order-service: order 服务的api 接口, @RequestMapping("/getOrder") 是为了Feign 客户端来调用

    public interface IOrderService {
        
        @RequestMapping("/getOrder")
        public Order getOrder(String orderId);
    }

    第三步:

    springcloud-api-order-impl-service: order 服务的api 接口的具体实现,因为在不同的项目里面,所以要在maven里面把springcloud-api-order-service 的依赖加进去

    <!--把order的接口引入过来 -->
        <dependencies>
            <dependency>
                <groupId>com.aiyuesheng</groupId>
                <artifactId>springcloud-api-order-service</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>

    开始写接口的实现:

    @RestController
    public class OrderServiceImpl implements IOrderService {
    
        @RequestMapping("/getOrder")
        public Order getOrder(String orderId) {
            Order order = new Order();
            order.setOrderId(orderId);
            order.setOrderName("订单名称");
            return order;
        }
    
    }

    第四步:在springcloud-api-member-impl-service 里面开始掉用order 服务,使用feign 客户端,

    创建了 OrderServiceFeign,指定需要调用的服务名称

    @RestController
    public class MemberServiceImpl {
        
        @Autowired
        private OrderServiceFeign orderServiceFeign;
        //通过feign 客户端来实现远程调用
        @RequestMapping("/getOrder")
        public Order getOrder(String orderId){
            Order order = orderServiceFeign.getOrder(orderId);
            return order;
        }
    
    }

    指定了调用的服务别名:app-aiyuesheng-order

    @FeignClient(value = "app-aiyuesheng-order")
    public interface OrderServiceFeign extends IOrderService {
        
        
    
    }

    同时继承了IOrderService,相当于这部分代码不用写了,写出来就是冗余的代码

        @RequestMapping("/getOrder")
        public Order getOrder(String orderId);

    但是需要在maven 里面加入依赖:

    <dependencies>
            <dependency>
                <groupId>com.aiyuesheng</groupId>
                <artifactId>springcloud-api-order-service</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>

    这样,就完成了代码的重构,以及用Feign 客户端实现远程调用

    主要Feign 客户端是默认支持Ribbon 客户端负载均衡器的,所以,当服务集群的时候,也能够轮询式的访问

    如果使用Feign 客户端远程调用接口的时间过长怎么处理呢?可以加入超时时间的配置:

    ###设置feign客户端超时时间
    ribbon:
    ###指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
     ReadTimeout: 5000
    ###指的是建立连接后从服务器读取到可用资源所用的时间。 
     ConnectTimeout: 5000
  • 相关阅读:
    POJ 2923 Relocation (状态压缩,01背包)
    HDU 2126 Buy the souvenirs (01背包,输出方案数)
    hdu 2639 Bone Collector II (01背包,求第k优解)
    UVA 562 Dividing coins (01背包)
    POJ 3437 Tree Grafting
    Light OJ 1095 Arrange the Numbers(容斥)
    BZOJ 1560 火星藏宝图(DP)
    POJ 3675 Telescope
    POJ 2986 A Triangle and a Circle
    BZOJ 1040 骑士
  • 原文地址:https://www.cnblogs.com/pickKnow/p/11388547.html
Copyright © 2011-2022 走看看