欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

微服务实战——SpringCloud与Feign集成

程序员文章站 2022-06-19 10:14:04
上一篇集成了ZuulGateway和Eureka并进行了测试。在实际场景中,我们肯定会有很多的微服务,而他们之间可能会存在相互调用的关系,那么,如何优雅的处理服务之间的调用问题呢?接下来就是我们要解决的。 简单的说下Feign Feign 是一个声明式REST Web服务客户端,可以处理微服务间的W ......

上一篇集成了zuulgateway和eureka并进行了测试。在实际场景中,我们肯定会有很多的微服务,而他们之间可能会存在相互调用的关系,那么,如何优雅的处理服务之间的调用问题呢?接下来就是我们要解决的。

简单的说下feign

feign 是一个声明式rest web服务客户端,可以处理微服务间的web服务调用。他是使用注解加接口的形式形成去调用服务的,相对来说不是很难,有兴趣可去官方地址了解下。这里不多介绍。

如何用

这里我们还是基于之前的spring cloud demo去改造,老规矩先附上源码地址

步骤
  1. 这里consumer与provider分别代表两个微服务,测试时,使用controller通过feign调用provider。调用流程如下: 网关zuul -> consumer -> provider
  2. 引入依赖
    <dependency>
        <groupid>org.springframework.cloud</groupid>
        <artifactid>spring-cloud-starter-openfeign</artifactid>
    </dependency>
    
  3. 在consumer的启动类上增加注解,开启feign的支持
    @enablefeignclients
    
  4. 在consumer新增controller以供测试时调用
     package cn.kxtop.blog.consumer.controller;
    
     import cn.kxtop.blog.consumer.client.providerclient;
     import lombok.extern.slf4j.slf4j;
     import org.springframework.beans.factory.annotation.autowired;
     import org.springframework.web.bind.annotation.getmapping;
     import org.springframework.web.bind.annotation.postmapping;
     import org.springframework.web.bind.annotation.requestmapping;
     import org.springframework.web.bind.annotation.restcontroller;
    
     @slf4j
     @restcontroller
     @requestmapping("/feign")
     public class testfeigncontroller {
    
    
         @autowired
         private providerclient providerclient;
    
    
         @getmapping
         public string get() {
             log.info("consumer feign get action");
             return providerclient.get();
         }
    
         @postmapping
         public string post() {
             log.info("consumer feign post action");
             return providerclient.post();
         }
    
     }
    
    
  5. 在consumer定义feingn接口
     package cn.kxtop.blog.consumer.client;
    
     import org.springframework.cloud.openfeign.feignclient;
     import org.springframework.web.bind.annotation.getmapping;
     import org.springframework.web.bind.annotation.postmapping;
    
    
     @feignclient(name = "kxtop-provider", path = "/api/test-feign")
     public interface providerclient {
    
         @getmapping("/")
         string get();
    
         @postmapping("/")
         string post();
    
     }
    
    
  6. 在provider中新增rest接口,这里主要用于测试,供consumer调用
     package cn.kxtop.blog.provider.controller;
    
     import lombok.extern.slf4j.slf4j;
     import org.springframework.web.bind.annotation.getmapping;
     import org.springframework.web.bind.annotation.postmapping;
     import org.springframework.web.bind.annotation.requestmapping;
     import org.springframework.web.bind.annotation.restcontroller;
    
     @slf4j
     @restcontroller
     @requestmapping("/test-feign")
     public class testfeigncontroller {
    
         @getmapping
         public string get() {
             log.info("provider feign get action");
             return "test feign get";
         }
         @postmapping
         public string post() {
             log.info("provider feign post action");
             return "test feign post";
         }
    
     }
    
    
  7. 使用postman请求consumer测试
    观察得知,postman请求到网关之后分发到consumer微服务,微服务通过feign接口调用provider微服务并接收到返回值,之后原路返回到consumer。当然,这里只是简单的演示下如何使用feign,实际生产环境中,使用远不止这么简单,这就需要我们慢慢去摸索了...
    微服务实战——SpringCloud与Feign集成
    微服务实战——SpringCloud与Feign集成
    微服务实战——SpringCloud与Feign集成

最后

到这里,我们的基本框架已经搭建完成,我们用springcloud集成了网关(zuul),还加入了服务发现与注册(eureka),也演示了微服务间的调用并集成了feign。

那么基于以上,我们会发现还是会有些场景没有解决。比如,我的配置都在properties里面,参数都是写死的,到线上后怎样在不重启服务的情况下修改参数?怎样进行灰度发布或金丝雀测试?还有我们的微服务已经通过feign可以相互调用了,那我怎样监测他们的运行情况?如果出故障时,如何快速的知道并修复?数据量太大,一台扛不住又该如何?在springcloud中又如何处理分库分表读写分离?

别急,后面我们都会讲到...

持续学习,记录点滴。更多文章请访问