springcloud基础搭建

springcloud简介

Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。

Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等项目。

image

常用组件介绍

Spring Cloud Config:配置管理开发工具包,可以让你把配置放到远程服务器,目前支持本地存储、Git以及Subversion。

Netflix Eureka:注册发现中心,一个基于 REST 的服务,用于定位服务,以实现云端的负载均衡和中间层服务器的故障转移。

Netflix Hystrix:容错管理工具,旨在通过控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。

Netflix Zuul:边缘服务工具,是提供动态路由,监控,弹性,安全等的边缘服务。

Feign: 一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。

Ribbon: 一个基于HTTP和TCP客户端的负载均衡器。

Spring Cloud Sleuth: 日志收集工具包,封装了Dapper,Zipkin和HTrace操作

Spring Cloud Bus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。

常用功能代码实现

eureka

该组件为springcloud基础组件,需要提供接口服务的需要引入该组件

pom修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Angel.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

springboot启动main类新增

1
@EnableEurekaClient

properties配置文件

1
2
3
4
5
6
7
eureka.client.registerWithEureka = true
eureka.client.fetchRegistry = true
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:11111/eureka/
eureka.client.registryFetchIntervalSeconds=10
eureka.instance.preferIpAddress = false
eureka.instance.leaseRenewalIntervalInSeconds=10
eureka.instance.leaseExpirationDurationInSeconds=30

其中eureka.client.serviceUrl.defaultZone可配置多个eureka 以逗号分隔,保证高可用。

Feign

需要调用注册到eureka上的服务需要引入该组件

pom修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Angel.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

springboot启动main类新增

1
@EnableFeignClients

feign依赖的接口,模拟http请求,对应定义出服务提供方的出入参,请求方式等即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 此处对应eureka中注册的小写名称
@FeignClient("compute-service")
public interface ComputeClient {

@RequestMapping(method = RequestMethod.GET, value = "/add")
Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b);

/**
*
* @param user
* @return
*/
@RequestMapping(method = RequestMethod.POST, value = "/addp",consumes = "application/json")
Integer addp(@RequestBody User user);
}

调用方式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Autowired
private ComputeClient computeClient;

/**
* 调用方
* @return
*/
@RequestMapping(value = "/testzd", method = RequestMethod.GET)
public Integer test(){
User user = new User();
user.setA(1);
user.setB(2);
return computeClient.addp(user);
}

hystrix

针对某个接口提供限流,等待超时的

pom修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Angel.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

springboot启动main类新增

1
@EnableHystrix

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* 被调用方(post json 服务)
* 该服务添加了hystrix断路器配置,采用的是注解方式,
* 具体参数使用方式请查看wiki地址:https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica
* @param user
* @return
*/
@HystrixCommand(fallbackMethod = "addpdegrade",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "500")
},
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "30"),
@HystrixProperty(name = "maxQueueSize", value = "101"),
@HystrixProperty(name = "keepAliveTimeMinutes", value = "2"),
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "15"),
@HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "12"),
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "1440")
})
@RequestMapping(value = "/addp" ,method = RequestMethod.POST)
public Integer addp(@RequestBody User user) {
/*try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
Integer r = user.getA() + user.getB();
return r;
}


private Integer addpdegrade(User user){
return -9999;
}

如上,当请求处理超时或者并发量超过配置时会调用降级方法addpdegrade()。

zhang dong wechat
关注我的微信来交流技术问题吧!