服务的发现和消费

有了服务中心和服务提供者,下面我们来实现一个服务的消费者:

服务消费者主要完成两个任务——服务的发现和服务的消费,服务发现的任务是由Eureka客户端完成,而服务消费的任务是由Ribbon完成。

Ribbon是一个基于HTTP和TCP客户端的负载均衡器。它可以在通过客户端中配置ribbonServerList服务端列表去轮询访问以达到负载均衡目的。

当Ribbon和Eureka同时使用时,Ribbon的服务实例清单RibbonServerList会被DiscoveryEnableNIEWServerList重写。

Ribbon将职责交给Eureka来确定服务端是否已经启动。

例:构建服务发现和消费简单示例:

1. 将上一节的/hello 服务通过jar -jar 使用不同的两个端口来启动,为了试验下Ribbon客户端负载均衡的功能,通过如下命令来启动两个不同的服务:

  1. java -jar helloworld-0.0.1-SNAPSHOT.jar --server.port=8081
  2. java -jar helloworld-0.0.1-SNAPSHOT.jar --server.port=8082

启动后在服务注册中心就可以看到这两个实例服务,如下:

2. 创建新的基础Spring Boot工程来作为服务消费者,取名ribbon-consumer,加入依赖。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <groupId>com.dcz</groupId>
  7. <artifactId>rebbon-consumer</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10.  
  11. <name>rebbon-consumer</name>
  12. <description>Demo project for Spring Boot</description>
  13.  
  14. <parent>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-parent</artifactId>
  17. <version>1.3.8.RELEASE</version>
  18. <relativePath/> <!-- lookup parent from repository -->
  19. </parent>
  20.  
  21. <properties>
  22. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  23. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  24. <java.version>1.8</java.version>
  25. </properties>
  26.  
  27. <dependencies>
  28.  
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-web</artifactId>
  32. </dependency>
  33.  
  34. <dependency>
  35. <groupId>org.springframework.cloud</groupId>
  36. <artifactId>spring-cloud-starter-eureka</artifactId>
  37. </dependency>
  38.  
  39. <dependency>
  40. <groupId>org.springframework.cloud</groupId>
  41. <artifactId>spring-cloud-starter-ribbon</artifactId>
  42. </dependency>
  43.  
  44. </dependencies>
  45.  
  46. <dependencyManagement>
  47. <dependencies>
  48. <dependency>
  49. <groupId>org.springframework.cloud</groupId>
  50. <artifactId>spring-cloud-dependencies</artifactId>
  51. <version>Brixton.SR5</version>
  52. <type>pom</type>
  53. <scope>import</scope>
  54. </dependency>
  55. </dependencies>
  56.  
  57. </dependencyManagement>
  58.  
  59. <build>
  60. <plugins>
  61. <plugin>
  62. <groupId>org.springframework.boot</groupId>
  63. <artifactId>spring-boot-maven-plugin</artifactId>
  64. </plugin>
  65. </plugins>
  66. </build>
  67.  
  68. </project>

3. 在刚创建的应用主类中RebbonConsumerApplication上,通过@EnableDiscoveryClient注解让该应用注册为Eureka客户端应用,以获得服务发现能力。

同时在该主类中创建RestTemplate的Spring Bean实例,并通过@LoadBalanced注解开启客户端负载均衡。

  1. package com.dcz;
  2.  
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  6. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.web.client.RestTemplate;
  9.  
  10. @EnableDiscoveryClient // 获得服务发现能力
  11. @SpringBootApplication
  12. public class RebbonConsumerApplication {
  13.  
  14. @Bean
  15. @LoadBalanced // 开启负载均衡
  16. RestTemplate restTemplate(){
  17. return new RestTemplate();
  18. }
  19.  
  20. public static void main(String[] args) {
  21. SpringApplication.run(RebbonConsumerApplication.class, args);
  22. }
  23. }

4. 创建ConsumerController控制器并实现/ribbon-consumer接口,并通过注入RestTemplate来实现对服务中心的服务进行调用。

我们必须通过服务名的方式来进行调用,在服务治理框架中这个非常重要。

  1. package com.dcz;
  2.  
  3. import com.netflix.discovery.converters.Auto;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestMethod;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import org.springframework.web.client.RestTemplate;
  9.  
  10. /**
  11. * Created by Administrator on 2017/5/13.
  12. */
  13.  
  14. @RestController
  15. public class ConsumerController {
  16.  
  17. @Autowired
  18. RestTemplate restTemplate;
  19.  
  20. @RequestMapping(value = "/ribbon-consumer", method = RequestMethod.GET)
  21. public String helloConsumer(){
  22. return restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody();
  23. }
  24.  
  25. }

6. 最后在application.properties 文件中配置Eureka服务中心的位置,并设置一个不同的端口。

  1. spring.application.name=ribbon-consumer
  2. server.port=9000
  3.  
  4. eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/

7. 启动rebbon-consumer应用,之后我们就可以在服务中心面板中看到了RIBBON-CONSUMER服务。

8. 在浏览器中通过http://localhost:9000/rebbon-consumer发起GET请求。

我们可以多次刷新,打开应用的两个不同端口的控制条发现Rebbon会轮询的方式调用两个应用。

Spring Cloud 服务发现和消费的更多相关文章

  1. 【spring cloud】spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient

    spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient的区别

  2. spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient区别

    在使用服务发现的时候有两种注解, 一种为@EnableDiscoveryClient, 一种为@EnableEurekaClient, 用法上基本一致,下文是从stackoverflow上面找到的对这 ...

  3. spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient

    使用服务发现的时候提到了两种注解,一种为@EnableDiscoveryClient,一种为@EnableEurekaClient,用法上基本一致,今天就来讲下两者,下文是从stackoverflow ...

  4. spring cloud 服务发现

    Eureka 当注册中心使用. 注: 1.当仅有一台Eureka时,不需要向别的节点注册. 2.集群的时候,需要相互注册. 工作方式: 前提: Eureka    //注册中心 provide1  / ...

  5. 笔记:Spring Cloud Eureka 服务发现与消费

    服务发现与消费,其服务发现的任务是由Eureka的客户端完成,而服务的消费任务由Ribbon.JerseyClient等完成,Ribbon是一个基于HTTP和TCP的客户端负载均衡器:使用Jersey ...

  6. Spring Cloud Eureka 服务发现与消费

    服务发现与消费,其服务发现的任务是由Eureka的客户端完成,而服务的消费任务由Ribbon.JerseyClient等完成,Ribbon是一个基于HTTP和TCP的客户端负载均衡器:使用Jersey ...

  7. spring cloud 服务注册中心eureka高可用集群搭建

    spring cloud 服务注册中心eureka高可用集群搭建 一,准备工作 eureka可以类比zookeeper,本文用三台机器搭建集群,也就是说要启动三个eureka注册中心 1 本文三台eu ...

  8. Spring Cloud服务注册中心交付至kubernetes

    前言 服务发现原则: 各个微服务在启动时,会将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息 服务消费者可以从服务发现组件中查询到服务提供者的网络地址,并使用该地址来远程调用服务 ...

  9. Spring Cloud 服务端注册与客户端调用

    Spring Cloud 服务端注册与客户端调用 上一篇中,我们已经把Spring Cloud的服务注册中心Eureka搭建起来了,这一章,我们讲解如何将服务注册到Eureka,以及客户端如何调用服务 ...

随机推荐

  1. How to Write a Spelling Corrector用java 写拼写检查器 Java实现 以备查验

    import java.io.*;import java.util.*;import java.util.regex.*; class Spelling { private final HashMap ...

  2. 【255】◀▶IEW-Unit20

    Unit 20 Environment: Tourism I.定语从句及分词在雅思写作中的运用 定语从句: 1. 先行词 2. 关系词:关系代词.关系副词 3. 非限制性定语从句 4. 分词和定语从句 ...

  3. CentOS7下yum方式安装mysql5.6

    在Centos7中用MariaDB代替了mysql数据库.所以在新安装MySQL前必须做好对系统的清理工作. 一.清理CentOS7下的MariaDB. [root@localhost ~]#rpm ...

  4. Lucene.net 搜索引擎的中文资料

    以下是我找到的网上一些关于Lucene.net 搜索引擎的介绍资料 https://code.i-harness.com/zh-CN/tagged/lucene?page=5 http://jingp ...

  5. 1.5 xss漏洞修复

    1.XSS漏洞修复 从上面XSS实例以及之前文章的介绍我们知道XSS漏洞的起因就是没有对用户提交的数据进行严格的过滤处理.因此在思考解决XSS漏洞的时候,我们应该重点把握如何才能更好的将用户提交的数据 ...

  6. Web 应用之数据库的配置 与链接 Mysql

    source 绝对路径.sql(绝对路径是对应数据库版本包下的) source时是有先后顺序的必须是create 在insert 在 下面是链接,上面是把数据导入到数据库中,数据也可以自己写进去. 配 ...

  7. Ping++中的AlipaySDK和AlicloudUTDID冲突解决方案

    今天维护一个老项目发现阿里框架冲突 问题截图: 解决方案: 去阿里文档中心 https://docs.open.alipay.com/54/104509 重新下载没有UTDID冲突的库 下载SDK解压 ...

  8. JDK1.8源码(十一)——java.util.TreeMap类

    在前面几篇博客分别介绍了这样几种集合,基于数组实现的ArrayList 类,基于链表实现的LinkedList 类,基于散列表实现的HashMap 类,本篇博客我们来介绍另一种数据类型,基于树实现的T ...

  9. [WIP]php入門

    创建: 2019/06/19 安装  MAMP   变量与运算符  php标签  <?php ... ?> <?php ... ?> ● 在文件最后的 ?> 通常省略, ...

  10. return die exit 常用

    die()停止程序运行,输出内容exit是停止程序运行,不输出内容return是返回值die是遇到错误才停止exit是直接停止,并且不运行后续代码,exit()可以显示内容.return就是纯粹的返回 ...