[菜鸟SpringCloud入门]第四章:远程调用服务实战

在这里插入图片描述

前言

欢迎来到菜鸟SpringCloud入门实战系列(SpringCloudForNoob),该系列通过层层递进的实战视角,来一步步学习和理解SpringCloud。

本系列适合有一定Java以及SpringBoot基础的同学阅读。

每篇文章末尾都附有本文对应的Github源代码,方便同学调试。

Github仓库地址:

https://github.com/qqxx6661/springcloud_for_noob

菜鸟SpringCloud入门实战系列

你可以通过以下两种途径查看菜鸟SpringCloud入门实战系列

前文回顾:

实战版本

  • SpringBoot:2.0.3.RELEASE
  • SpringCloud:Finchley.RELEASE

-----正文开始-----

远程调用服务实战

本章节中需要有三个角色:服务注册中心(对应前文中我们的eureka子模块)、服务提供者(对应前文中我们的eureka-hi子模块)、服务消费者,其中服务注册中心就是我们上一篇的eureka单机版启动既可,流程是首先启动注册中心,服务提供者生产服务并注册到服务中心中,消费者从服务中心中获取服务并执行。

服务提供者:使用原来的eureka-hi子模块

子模块不需要做更改。

值得注意的是,你可以使用@EnableDiscoveryClient代替@EnableEurekaClient

两者的区别:

https://www.jianshu.com/p/f6db3117864f

注解@EnableEurekaClient上有@EnableDiscoveryClient注解,可以说基本就是EnableEurekaClient有@EnableDiscoveryClient的功能,另外上面的注释中提到,其实@EnableEurekaClientz注解就是一种方便使用eureka的注解而已,可以说使用其他的注册中心后,都可以使用@EnableDiscoveryClient注解,但是使用@EnableEurekaClient的情景,就是在服务采用eureka作为注册中心的时候,使用场景较为单一。

服务消费者:新建service-feign子模块

创建子模块service-feign,步骤和之前类似,请参考教程第一章。

修改pom.xml,引入:

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

然后在主程序引入:

@EnableFeignClients
@EnableEurekaClient

这时候,我的springboot2.0.3又出事了,@EnableFeignClients无法引入,需要将pom.xml的引入修改为:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <!--spring boot 2.0.3版本解决方案:spring-cloud-starter-feign-->
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

补充:Spring Boot 2下使用Feign找不到@EnableFeignClients的解决办法

https://blog.csdn.net/alinyua/article/details/80070890

该作者给了一个完整的解决无法引入包问题的思路,文章篇幅很长,思路值得学习!

之后,修改application.yml:

server:
  # 服务端口号
  port: 8765
spring:
  application:
    # 服务名,即serviceId
    name: service-feign
eureka:
  client:
    serviceUrl:
      # 安全认证的服务注册中心地址
      defaultZone: http://localhost:8761/eureka

远程调用

首先回顾一下eureka-hi的方法,它提供了一个上述eureka-hi服务提供了一个RESTful风格的接口:

/** 获取端口号 */
@Value("${server.port}")
String port;

/**
 * 定义一个简单接口
 * @param name
 * @return
 */
@GetMapping("/hi/{name}")
public String home(@PathVariable String name){
    return "hi " + name + ",I am from service-hi, port :" + port;
}
  • 行为:GET
  • 资源:/hi/{name}

编写调用eureka-hi提供的接口的本地接口ServiceHi.java,如下:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * <p>一个Feign服务消费者接口</p>
 **/
@FeignClient(value = "service-hi")
public interface ServiceHi {
    /**
     * <p>通过Feign伪Http客户端调用service-hi提供的服务</p>
     * @author hanchao 2018/5/19 17:59
     **/
    @GetMapping("/hi/{name}")
    String sayHiFromServiceHi(@PathVariable(value = "name") String name);
}

说明:

  • 通过@FeignClient标识当前接口是一个Feign客户端,value = "service-hi"表示其针对的是名为service-hi的服务。
  • service-hi则是我们eureka-hi子模块的spring.application.name,这个name已经在eureka注册过
  • sayHiFromServiceHi方法为伪装成HTTP客户端方法,与eureka-hi的[GET] /hi/{name}服务接口相对应。

之后,新建HelloController.java,如下:


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>服务消费控制层</p>
 **/
@RestController
public class HelloController {

    /** 注入服务"service-hi"的Feign客户端ServiceHi */
    @Autowired
    private ServiceHi serviceHi;

    /**
     * 调用Feign客户端提供的服务,自带负载均衡
     * @param name
     * @return
     */
    @GetMapping("/hello/{name}")
    public String sayHi(@PathVariable String name){
        //调用Feign客户端ScheduleServiceHi的接口
        return serviceHi.sayHiFromServiceHi(name);
    }
}

重点:

  • serviceHi.sayHiFromServiceHi(name)即通过Feign调用伪HTTP客户端的服务接口。

至此我们已经配置完毕,依次启动服务eureka、eureka-hi和service-feign。可以看到两个服务都已经在eureka注册:

在这里插入图片描述

访问 http://localhost:8765/hello/rude3knife ,即service-feign提供的服务接口。
这个服务接口会通过Feign去调用服务eureka-hi提供的服务接口,结果显示服务间调用成功。

在这里插入图片描述

在该调用中,我们feign并不需要指定端口号,它并不知道这个方法所在的服务提供者现在在哪个端口运行,我们只需要向eureka寻求服务。

三个模块的拓扑图如下:

在这里插入图片描述

测试Feign负载均衡

Feign会对服务调用进行负载平衡,我们需要同时打开两个eureka-hi服务,由于在同一台电脑上,就得把端口号从8763改为8764,然后同时开启8763和8764两个服务。

要同时运行两个端口不同的相同服务,需要在run configuration里面把allow parallle打开:

在这里插入图片描述

运行结构是这样的:

在这里插入图片描述

可以看到有两个Service-Hi进行了注册:

在这里插入图片描述

访问http://localhost:8765/hello/rude3knife

连续访问两次,发现两次会分别取调用eureka-hi的两个服务节点:

在这里插入图片描述

在这里插入图片描述

最后是负载平衡的拓扑图:

在这里插入图片描述

本章代码

https://github.com/qqxx6661/springcloud_for_noob/tree/master/04-servier-feign

参考

Spring-Cloud笔记04:服务消费者Feign

https://blog.csdn.net/hanchao5272/article/details/80574441

springcloud(三):服务提供与调用

http://www.ityouknow.com/springcloud/2017/05/12/eureka-provider-constomer.html

-----正文结束-----

菜鸟SpringCloud实战专栏全导航:通过以下两种途径查看

关注我

我是蛮三刀把刀,后端开发。

主要关注后端开发,数据安全,爬虫等方向。

来微信和我聊聊:yangzd1102

Github个人主页:

https://github.com/qqxx6661

原创博客主要内容

  • Java知识点复习全手册
  • Leetcode算法题解析
  • 剑指offer算法题解析
  • Python爬虫相关技术实战
  • 后端开发相关技术实战
  • SpringCloud入门实战

同步更新公众号及以下博客

1. Csdn

http://blog.csdn.net/qqxx6661

拥有专栏:

  • Leetcode题解(Java/Python)
  • Python爬虫实战
  • Java程序员知识点复习手册
  • SpringCloud入门实战

2. 知乎

https://www.zhihu.com/people/yang-zhen-dong-1/

拥有专栏:

  • Java程序员面试复习手册
  • LeetCode算法题详解与代码实现
  • 后台开发实战

3. 掘金

https://juejin.im/user/5b48015ce51d45191462ba55

4. 简书

https://www.jianshu.com/u/b5f225ca2376

个人公众号:Rude3Knife

个人公众号:Rude3Knife

如果文章对你有帮助,不妨收藏起来并转发给您的朋友们~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容