spring cloud 简介
是一套解决分布式架构的框架,提供配置管理、服务注册、服务发现、断路器、智能路由、负载均衡、微代理、一次性令牌、控制总线...等功能。spring boot 是构建spring cloud 架构的基础,spring cloud的每一个子项目都是基于spring boot构建的。
spring cloud子项目介绍
- spring cloud config
配置中心,利用git 来集中管理程序的配置。 - spring cloud netflix
集成众多netflix的开源组件,包括eureka,hystrix,zuul等 - spring cloud bus
消息总线,利用分布式消息将服务和服务实例连接在一起,用于在集群中传播状态的变化,比如配置更改的事件。 - spring cloud security
在zuul 代理中为oauth2 rest客户端和认证头转发提供负载均衡。
......
Eureka 服务注册与发现
下面我们通过一个demo来了解如何实现eureka server:
首先我们需要在pom.xml中添加对spring cloud的依赖:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
与普通的spring boot项目不同之处在于此处添加了<dependencyManagement>标签包含的部分,其中spring cloud的版本以version标签标示,且版本以伦敦地铁站的名字来表示,此处我们粘贴<properties>标签的部分是为了提醒大家,spring cloud的版本和spring boot版本存在依赖关系,如果spring cloud版本未配置对应的spring boot版本,则启动项目的时候会抛出异常:
Failed to process import candidates for configuration class ......
上面的配置经验证无误,服务可以正常启动。
接下来我们只需添加一个@EnableEurekaServer注解就可以启动一个服务注册中心:
@EnableEurekaServer
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
另外我们还需配置一下配置文件,控制其注册行为:
server.port=8761
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
eureka配置中:
- eureka.client.register-with-eureka 表示是否向注册中心注册自己(由于eureka服务端也可以作为客户端在其他服务端被注册),此处我们先设置为false,即不向注册中心注册自己。
- eureka.client.fetch-registry 是否去检索查找服务(发现服务也是客户端的工作,此处我们暂且设为false)
- eureka.client.serviceUrl.defaultZone eureka server 启动地址。
完成上述操作后,我们就可以正常启动一个eureka server了,启动完后,通过访问:http://localhost:1111/
就可以打开下面的界面:
在Instances currently registered with Eureka模块中当前显示:No instances available。这是因为现在我们只实现了一个注册中心,还没有实现其他服务。
实现了服务的注册eureka server后,我们接着实现eureka客户端:
pom.xml文件中添加如下:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
启动应用处添加注解:
@SpringBootApplication
@EnableDiscoveryClient
public class ConcurrencyApplication {
public static void main(String[] args) {
SpringApplication.run(ConcurrencyApplication.class, args);
}
}
配置文件中加上:
spring.application.name=micro-weather-eureka-client
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
spring.application.name表示服务名称
eureka.client.serviceUrl.defaultZone表示指定服务注册中心的地址。
配置好后,我们首先启动之前编写好的eureka server服务demo,然后再启动eureka client 服务demo。然后我们访问http://localhost:8761/后截屏如下:
这时我们发现Instances currently registered with Eureka列表中已经显示我们刚刚实现的应用eureka client了,名称为micro-weather-eureka-client,状态为UP,即启动。
spring cloud 常见消费模式
- 客户端发现模式(客户端负载均衡)
- 服务实例启动后,将自己的位置信息提交到服务注册表。
- 客户端从服务注册表进行查询,来获取可用的服务实例。
-
客户端自行使用负载均衡算法从多个服务实例中选择出一个。
image.png
-
服务端发现模式(服务端负载均衡)
负载均衡器独立部署在服务端
image.png
常见微服务消费者
- Apache HttpClient
- Ribbon (spring cloud 中基于netflix的ribbon实现的客户端负载均衡工具)
- Feign (feign 是一种eureka 客户端)
网友评论