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状态.

eureka的状态

然后我们在调用 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

与君共勉!!!

0 0