0 联系我
1.Java 开发技术交流 Q 群 https://jq.qq.com/?_wv=1027&k=5UB4P1T
2. 完整博客链接 http://www.shishusheng.com/
3. 个人知乎 http://www.zhihu.com/people/shi-shu-sheng-
4.gayhub https://github.com/Wasabi1234
相关源码
本文会介绍使用 Ribbon 与 Feign 组件实现微服务之间的调用.
1 创建广告检索系统子模块
新建搜索服务子模块
编辑 pom 文件
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <!-- 指定父 pom, 注意它是 javaedge-ad-service 的子模块 -->
- <parent>
- <artifactId>javaedge-ad-service</artifactId>
- <groupId>com.sss.ad</groupId>
- <version>1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <!-- 当前项目 / 模块的坐标, groupId 从父模块中继承 -->
- <artifactId>ad-search</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>jar</packaging>
- <dependencies>
- <!-- Hystrix 监控 -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
- </dependency>
- <!-- 监控端点, 采集应用指标 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- <!-- 引入 web 功能 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
- <!--
- Eureka 客户端, 客户端向 Eureka Server 注册的时候会提供一系列的元数据信息, 例如: 主机, 端口, 健康检查 url 等
- Eureka Server 接受每个客户端发送的心跳信息, 如果在某个配置的超时时间内未接收到心跳信息, 实例会被从注册列表中移除
- -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
- <!-- 引入 Feign, 可以以声明的方式调用微服务 -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-openfeign</artifactId>
- </dependency>
- <!-- 引入服务容错 Hystrix 的依赖 -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
- </dependency>
- <!-- 引入服务消费者 Ribbon 的依赖 -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
- </dependency>
- <!-- Java Persistence API, ORM 规范 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
- <!-- 数据库连接 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jdbc</artifactId>
- </dependency>
- <!-- MySQL 驱动, 注意, 这个需要与 MySQL 版本对应 -->
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- <version>8.0.12</version>
- <scope>runtime</scope>
- </dependency>
- <!-- 通用模块 -->
- <dependency>
- <groupId>com.sss.ad</groupId>
- <artifactId>ad-common</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- <!-- apache 提供的一些工具类 -->
- <dependency>
- <groupId>commons-codec</groupId>
- <artifactId>commons-codec</artifactId>
- <version>1.9</version>
- </dependency>
- <!-- 集合类操作 -->
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-collections4</artifactId>
- <version>4.0</version>
- </dependency>
- <!-- binlog 监听与解析: https://github.com/shyiko/mysql-binlog-connector-java -->
- <dependency>
- <groupId>com.GitHub.shyiko</groupId>
- <artifactId>MySQL-binlog-connector-java</artifactId>
- <version>0.13.0</version>
- </dependency>
- <!-- 解析配置文件中的配置 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-configuration-processor</artifactId>
- </dependency>
- <!--kafka 依赖 -->
- <dependency>
- <groupId>org.springframework.kafka</groupId>
- <artifactId>spring-kafka</artifactId>
- <version>2.1.5.RELEASE</version>
- </dependency>
- </dependencies>
- <!--
- SpringBoot 的 Maven 插件, 能够以 Maven 的方式为应用提供 SpringBoot 的支持, 可以将
- SpringBoot 应用打包为可执行的 jar 或 war 文件, 然后以通常的方式运行 SpringBoot 应用
- -->
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
2 基于 Ribbon 实现微服务调用
Client Side Load Balancer: Ribbon
Ribbon 是一个客户端负载均衡器, 可很好地控制 HTTP 和 TCP 客户端的行为.
Feign 已经使用 Ribbon, 所以若使用 @FeignClient, 则本节也适用也是必备知识点.
Ribbon 中的中心概念是指定客户端的概念
每个负载平衡器是集合组件的一部分, 它们一起工作以根据需要与远程服务器通信, 并且集合具有你将其作为应用程序开发人员 (例如使用 @FeignClient 注解) 的名称.
Spring Cloud 使用 RibbonClientConfiguration 为每个命名的客户端根据需要创建一个新的集合作为 ApplicationContext. 这包含 ILoadBalancer,RestClient 和 ServerListFilter.
2.1 添加 Ribbon
要在项目中包含 Ribbon, 请使用
grouporg.springframework.cloud,artifact ID spring-cloud-starter-ribbon 的 starter.
定义 demo 演示类
3 基于 Feign 实现微服务调用
Feign https://github.com/Netflix/feign 是一个声明式的 Web 服务客户端.
这使得 Web 服务客户端的写入更加方便, 要使用 Feign 创建一个接口, 并对其添加注解. 它提供了可插拔式的注解, 包括 Feign 注解和 JAX-RS 注解. Feign 还支持可插拔编码器和解码器.
Spring Cloud 增加了对 Spring MVC 注解的支持, 并使用 Spring Web 中默认使用的 HttpMessageConverters.
Spring Cloud 集成 Ribbon 和 Eureka 以在使用 Feign 时提供负载均衡的 http 客户端.
3.1 如何加入 Feign
要在项目中包含 Feign, 请使用 grouporg.springframework.cloud 和 artifact ID spring-cloud-starter-feign 的启动器.
Spring Boot 应用
接口文件
在 @FeignClient 注解中, String 值(上面的
eureka-client-ad-sponsor
)是一个任意的客户端名称, 用于创建 Ribbon 负载均衡器, 还可以使用 url 属性 (绝对值或只是主机名) 指定 URL.
应用程序上下文中的 bean 的名称是该接口的完全限定名, 要指定自己的别名, 可以使用 @FeignClient 注释的 qualifier 值.
3.2 Feign Hystrix 回退
Hystrix 支持回退的概念 : 当电路断开或出现错误时执行的默认代码路径.
要为给定的 @FeignClient 启用回退, 请将 fallback 属性设置为实现回退的类名.
来源: http://www.jianshu.com/p/9c62c0fbd139