SpringCloud系列研究---Eureka服务消费ribbon

一、Ribbon简介

     Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时、重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。同时我们也可以很容易的使用Ribbon实现一些自定义的负载均衡算法。

二、环境介绍

     同上一篇介绍Feign中的环境一样,首先我们在A服务器上启动Eureka服务,然后在B、C两台服务器上分别启动ms-demo-provider服务,这里也可以部署在一台服务器上采用不同的端口。访问Eureka界面查看服务注册状态,之后在本地新建客户端调用工程进行测试。此时A为Eureka的注册中心,B、C分别为服务提供者(提供相同的接口),本地工程为基于Ribbon的服务消费者。

三、项目代码

在Idea中创建maven工程,ms-ribbonclient-demo工程的最终代码结构如下:

1:pom.xml中的依赖如下:

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cloud.microservice</groupId>
    <artifactId>ms-ribbonclient-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>ms-ribbonclient-demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.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>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- 客户端负载均衡 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>

        <!-- eureka客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

        <!-- spring boot实现Java Web服务-->
        <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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

2:application.properties中的配置信息如下:

#应用名称
spring.application.name=ms-ribbonclient-demo

#端口号
server.port=9801

#注册中心的地址
eureka.client.serviceUrl.defaultZone=http://xx.xx.xx.:9000/eureka/

3:在入口类Application中增加@EnableEurekaClient注解,也可使用@EnableDiscoveryClient注解

package com.cloud.microservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@EnableEurekaClient //开启服务发现的能力
@SpringBootApplication
public class RibbonClientDemoApplication {

    @Bean //定义REST客户端,RestTemplate实例
    @LoadBalanced
        //开启负载均衡的能力
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(RibbonClientDemoApplication.class, args);
    }
}

4:新建服务消费者Controller类,RibbonClientController代码如下:

package com.cloud.microservice.ribbon;

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

@RestController
public class RibbonClientController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping(value = "/ribbon/findAll")//ribbon接口测试访问地址
    public String findAll() {
        //其中url为provider服务中注册到Eureka的application name的值和接口地址
        return restTemplate.getForEntity("http://ms-demo-provider/demo/user/1.0/findAll", String.class).getBody();
    }
}

启动工程,然后刷新Eureka界面,可以看到本地Ribbon服务已经注册到服务中心。

 

四、运行测试

打开浏览器,访问ms-ribbonclient-demo中的接口,地址:http://localhost:9801/ribbon/findAll,返回结果如下:

以上返回结果说明接口调用成功。同时我们也可以登陆到服务提供者的服务器上查看log, 通过多次访问http://localhost:9801/ribbon/findAll这个地址,可以看到B、C两台服务器上的provider中都有接口被调用的记录。

 

posted @ 2018-01-26 14:36  人生就是一场修行  阅读(344)  评论(0编辑  收藏  举报