1. 首页
  2. IT资讯

Spring Cloud 服务注册与发现(一)

简介:
Spring Cloud是一个基于Spring Boot实现云应用的开发工具。Spring Cloud 是Pivotal提供的用于简化分布式系统构建的工具集。Spring Cloud引入了云平
台连接器(Cloud Connector)和服务连接器(Service Connector)的概念。云平台连接器是一个接口,需要由云平台提供者进行实现,以便库中的其他模块可以与该云
平台协同工作。 Spring Cloud 为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性 Token、全局锁、决策竞
选、分布式会话和集群状态)操作的开发工具。使用 Spring Cloud 开发者可以快速实现上述这些模式。
Spring Boot:
  Spring Cloud最重要的一点是它可以和Spring Boot一起工作,Spring Boot可以帮助开发者更容易地创建基于Spring的应用程序和服务。
从Spring Boot项目名称中的Boot就可以看出来,Spring Boot的作用在于创建和启动新的基于Spring框架的项目。Spring Boot会选择最适合的Spring子项目和第三
方开源库进行整合。大部分Spring Boot应用只需要非常少的配置就可以快速运行起来。
Spring Cloud集成相关项目:

Spring Cloud Config:配置管理工具包。 Spring Cloud Bus:事件、消息总线、集群(例如,配置变化时间)中传播状态变化,可与Spring Cloud Config联合实现热部署。 Eureka:云端服务发现,一个基于Rest的服务,用于定位服务,以显示云端中间层服务发现和故障转移。 Hystrix:熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。、 Zuul:Zuul是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架;Zuul相当于是设备和Netflix流应用的Web网站后端所有请求的前门。 Archaius:配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。 Consul:封装了Consul操作,consul是一个服务发现与配置工具,与Docker容器可以无缝集成。 Spring Cloud for Cloud Foundry:通过Oauth2协议绑定服务到CloudFoundry,CloudFoundry是VMware推出的开源PaaS云平台。 Spring Cloud Sleuth:日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案。 Spring Cloud Data Flow:大数据操作工具,作为Spring XD的替代产品,它是一个混合计算模型,结合了流数据与批量数据的处理方式。 Spring Cloud Security:基于spring security的安全工具包,为你的应用程序添加安全控制。 Spring Cloud Zookeeper(操作Zookeeper的工具包,用于使用zookeeper方式的服务发现和配置管理。 Spring Cloud Stream:数据流操作开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。 Spring Cloud CLI:基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。 Ribbon:提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。 Turbine:Turbine是聚合服务器发送事件流数据的一个工具,用来监控集群下hystrix的metrics情况。 Feign:Feign是一种声明式、模板化的HTTP客户端。 Spring Cloud Task:提供云端计划任务管理、任务调度。 Spring Cloud Connectors:便于云端应用程序在各种PaaS平台连接到后端,如:数据库和消息代理服务。 Spring Cloud Cluster:提供Leadership选举,如:Zookeeper, Redis, Hazelcast, Consul等常见状态模式的抽象和实现。 Spring Cloud Starters:Spring Boot式的启动项目,为Spring Cloud提供开箱即用的依赖管理。 

接下来,我们创建一个以Spring Boot为基础的项目的“服务注册中心“”,Pom.xml文件依赖如下:

org.springframework.boot
spring-boot-starter-parent
1.3.8.RELEASE

<dependencies>     <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>Brixton.RELEASE</version>             <type>pom</type>             <scope>import</scope>         </dependency>     </dependencies> </dependencyManagement> 

如下代码;@EnableEurekaServer注解启动一个服务注册中心提供给其它应用进行对话。:
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

public static void main(String[] args) {     //SpringApplication.run(EurekaServerApplication.class, args);     new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args); } 

}

在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以需要禁用它的客户端注册行为,application.properties中问增加如下配置:
server.port=2888

#eureka.instance.hostname=localhost

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone={server.port}/eureka/
通过EurekaServerApplication 类,启动工程后,访问:

创建“服务提供方”:
创建提供服务的客户端,并向服务注册中心注册自己。
假设我们有一个提供计算功能的微服务模块,我们实现一个Restful API,通过传入两个参数a和b,最后返回a + b的结果。
首先,创建一个基于Spring Boot应用的项目,在pom.xml配置如下:

    <parent>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-parent</artifactId>         <version>1.3.8.RELEASE</version>         <relativePath/> <!-- lookup parent from repository -->     </parent>     <dependencies>         <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>Brixton.RELEASE</version>                 <type>pom</type>                 <scope>import</scope>             </dependency>         </dependencies>     </dependencyManagement>

我们创建一个Controller的类,来实现add请求处理接口,通过DiscoveryClient对象,在日志中打印出服务实例的相关内容。代码如下:

@RestController public class ComputeController {       private final Logger logger = Logger.getLogger(getClass());      @Autowired     private DiscoveryClient client;      @RequestMapping(value = "/add",method = RequestMethod.GET)     public Integer add(@RequestParam Integer a,@RequestParam Integer b){         final ServiceInstance instance = client.getLocalServiceInstance();         Integer i = a + b;         System.out.println("/add  host:" + instance.getHost() + "tport:"+instance.getPort()+"tserver_id:" + instance.getServiceId() + "result:" + i);         return i;     } }

最后,在启动类上中通过加上@EnableDiscoveryClient注解,该注解能激活Eureka中的DiscoveryClient实现,才能实现Controller中对服务信息的输出。代码如下:

@EnableDiscoveryClient @SpringBootApplication public class ComputeServiceApplication {      public static void main(String[] args) {         SpringApplication.run(ComputeServiceApplication.class, args);         //new SpringApplicationBuilder(ComputeServiceApplication.class).web(true).run(args);     } }

以上服务注册中心和服务的提供方实现了之后,还有一件事需要我们去做对application.properties添加如下配置,代码如下:

spring.application.name=compute-service  server.port=2222  eureka.client.serviceUrl.defaultZone=http://localhost:2888/eureka/

通过spring.application.name属性,我们可以指定微服务的名称,后续在调用的时候只需要使用该名称就即可进行服务的访问。

eureka.client.serviceUrl.defaultZone属性对应服务注册中心的配置内容,指定服务注册中心的位置。

为了在本机测试的时候区分服务提供方和服务注册中心,使用server.port属性设置不同的端口。

启动该工程后,再次访问:

谢谢观看135 记得点赞 · 加油学习 81 · 有问题私信我 73万+

原文始发于:

主题测试文章,只做测试使用。发布者:夏枳★,转转请注明出处:http://www.cxybcw.com/133169.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code