Spring Cloud笔记
来源:互联网 发布:java invoke 方法 编辑:程序博客网 时间:2024/06/05 22:59
仅限于学习用途的转载,转载请注明出处 http://www.eumji025.com/article/details/259925
Spring Cloud 使用 Ribbon 和 Feign做负载均衡
Ribbon介绍
Ribbon核心概念是命名的客户端.每个负载均衡器是共同组件的集合的一部分,通过远程服务器联系, 你把它作为应用程序开发者(例如,使用 @FeignClient
注解)的名称,Spring Cloud创建一个新的整体使用RibbonClientConfiguration
为每一个客户端命名的 ApplicationContext
,这包含(除其他事项外)的ILoadBalancer
,一个RestClient
实现和ServerListFilter
。
使用Ribbon做负载均衡
当Ribbon与Eureka联合使用时,RibbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。
开发案例
首先我们需要用到上一节中用到的eureka的server和client,我们需要再复制一份client,修改端口为8081.
此时我们有
- Eureka server http://localhost:8761
- Eureka client1 http://localhost:8080
- eureka client2 http://localhost:8081
配置Ribbon
pom.xml
引入Ribbon的maven依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Dalston.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-Ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
application.xml
配置Ribbon服务的相关信息(端口,eureka等)
spring: application: name: Ribbon-demoserver: port: 8082eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
application.java
@SpringBootApplication@EnableDiscoveryClientpublic class SpringCloudNetflixRibbonApplication { @Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(SpringCloudNetflixRibbonApplication.class, args); }}
通过@EnableDiscoveryClient注解开启服务发现功能,@LoadBalanced
注解开启均衡负载.至于@LoadBalanced的原理剖析,请参考这篇文章Ribbon源码剖析
controller
@RestControllerpublic class TestController { @Autowired private RestTemplate restTemplate; @RequestMapping(value = "/", method = RequestMethod.GET) public String info() { return restTemplate.getForEntity("http://eureka-client/", String.class).getBody(); }}
我们通过restTemplate去调度我们在eureka server中注册的服务.
此处的eureka-client需要和我们在eureka client中配置的名称一致,不然会导致出现如下错误:
No instances available for xxx
让我们依次开启eureka server,eurek client,Ribbon的服务.在网址中输入http://localhost:8761
可以看到eureka client,Ribbon都已经在eureka server中处于UP状态.
然后我们在调用 http://localhost:8082
分别在两个client中出现如下日志
2017-05-01 10:05:47.021 INFO 15240 — [nio-8081-exec-1] ingCloudDiscoveryEurekaClientApplication : hello world,this is eureka client2
2017-05-01 10:06:33.211 INFO 3552 — [nio-8080-exec-2] ingCloudDiscoveryEurekaClientApplication : hello world,this is eureka client1
说明Ribbon的负载均衡效果是有效的.
本案例只是简单的介绍Ribbon的负载均衡能力,更多有深度的东西,还需要在后续的学习中研究.
Feign介绍
Feign 是一个声明web服务客户端,这使得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters
, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign.
通过Feign也可以做到和Ribbon一样的负载均衡功能,配置和上面的基本一致,我们只需要将Ribbon的服务缓存Feign的服务即可.具体配置如下
Feign案例
pom.xml
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Dalston.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-Feign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
application.yml
spring: application: name: Feign-demoserver: port: 8083eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
和Ribbon的配置类似,都是配置服务中心等一些基本中心
application.java
@SpringBootApplication@EnableFeignClients@EnableEurekaClientpublic class SpringCloudNetflixFeignClientApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudNetflixFeignClientApplication.class, args); }}
@EnableFeignClients注解表示开启Feign的功能.@EnableEurekaClient开启eureka客户端支持
FeignClient
@FeignClient("eureka-client")public interface TestClient { @RequestMapping(method = RequestMethod.GET, value = "/") String getValue(String info);}
在@FeignClient
注释中,String值(以上“eureka-client”)是一个任意的客户端名称,用于创建功能区负载平衡器,和我们eureka的client名称要一致,不然会找不到服务.
controller
@RestControllerpublic class TestController { @Autowired private TestClient testClient; @RequestMapping("/") public String getInfo(){ return testClient.getValue("hello world"); }}
和上面的Ribbon的一样,依次开启eureka server,eureka client,Feign服务,然后在浏览器输入 http://localhost:8083两次
会出现和Ribbon一样的结果,这里就不再多描述.
结语
Ribbon和Feign的负载功能介绍到此结束,更多深入的内容我们需要去读他们的文档.
本文的demo已经放在github,地址https://github.com/eumji025/spring-cloud-repository
与君共勉!!!
- spring Cloud笔记
- spring cloud学习笔记
- Spring cloud笔记
- Spring cloud笔记
- Spring Cloud笔记
- spring cloud笔记
- spring cloud笔记
- spring cloud笔记
- spring cloud笔记
- Spring Cloud学习笔记
- Spring Cloud 学习笔记
- spring cloud 学习笔记
- Spring Cloud学习笔记
- spring cloud 学习笔记-Eureka
- spring cloud学习笔记-断路器
- Spring Cloud入门demo笔记
- Spring Cloud 笔记实战之 Spring Cloud Config
- Spring Cloud Netflix中文文档翻译笔记
- 升级到Spring Security 4.2的坑及解决办法
- Mac下的AndroidStudio的NDK配置及开发示例
- 自己仿制谷歌和百度首页
- 关于tomcat的Unsupported major.minor version 51.0问题记录
- POJ 1133 Stars 笔记
- Spring Cloud笔记
- qt之进程和线程
- HDOJ2000-2050学习笔记
- soapui测试webservice接口时如何传递xml参数
- 数组指针和指针数组的区别
- python 字符串 详解 (好用)
- Css lineheight 行高
- 【干货收藏】云服务器从选配置、到远程链接、到环境配置的新手入门百问-Windows系统篇
- 学习整理--对js的新认识