您的位置:首页 > 编程语言 > Java开发

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

2017-03-09 15:36 399 查看
简介:

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=http://localhost:${server.port}/eureka/

通过EurekaServerApplication 类,启动工程后,访问:http://localhost:2888/

创建“服务提供方”:

创建提供服务的客户端,并向服务注册中心注册自己。

假设我们有一个提供计算功能的微服务模块,我们实现一个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属性设置不同的端口。

启动该工程后,再次访问:http://localhost:2888/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: