前言
欢迎来到菜鸟 SpringCloud 入门实战系列(SpringCloudForNoob), 该系列通过层层递进的实战视角, 来一步步学习和理解 SpringCloud.
本系列适合有一定 Java 以及 SpringBoot 基础的同学阅读.
每篇文章末尾都附有本文对应的 GitHub 源代码, 方便同学调试.
GitHub 仓库地址:
https://github.com/qqxx6661/springcloud_for_noob
菜鸟 SpringCloud 入门实战系列
你可以通过以下两种途径查看菜鸟 SpringCloud 入门实战系列:
关注我的公众号: Rude3Knife 点击公众号下方: 技术推文 --SpringCloud
菜鸟 SpringCloud 实战专栏导航页(CSDN) https://blog.csdn.net/qqxx6661/column/info/35018
前文回顾:
[菜鸟 SpringCloud 入门]第一章: 构建多模块的 Maven 项目 + 创建注册中心 Eureka 子模块
[菜鸟 SpringCloud 入门]第二章: 创建服务提供者并在 Eureka 进行注册
[菜鸟 SpringCloud 入门]第三章: 将 Eureka 改造为高可用集群
... 更多文章请查看上方: 菜鸟 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.YAML:
- 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 实战专栏全导航: 通过以下两种途径查看
关注我的公众号: Rude3Knife 点击公众号下方: 技术推文 --SpringCloud
菜鸟 SpringCloud 实战专栏(CSDN) https://blog.csdn.net/qqxx6661/column/info/35018
关注我
我是蛮三刀把刀, 后端开发.
主要关注后端开发, 数据安全, 爬虫等方向.
来微信和我聊聊: 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. 掘金
juejin.im/user/5b4801...
4. 简书
https://www.jianshu.com/u/b5f225ca2376
个人公众号: Rude3Knife
如果文章对你有帮助, 不妨收藏起来并转发给您的朋友们~
来源: https://juejin.im/post/5c87b9c4e51d4534567f95a9