spring cloud基本介绍

一、简介

Spring Cloud是Spring旗下的项目之一,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。其主要涉及的组件包括:
Netflix
Eureka:注册中心
Zuul:服务网关
Ribbon:负载均衡
Feign:服务调用
Hystrix:熔断器

二、版本

在这里插入图片描述

三、创建父工程

微服务中需要同时创建多个项目,后续的工程都以这个工程为父,使用Maven的聚合和继承。统一管理子工程的版本和配置。

聚合父工程<packaging>pom</packaging>

四、创建服务

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="HTTP://maven.apache.org/POM/4.0.0"
xmlns:xsi="HTTP://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="HTTP://maven.apache.org/POM/4.0.0
HTTP://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
	<artifactId>lxs-springcloud</artifactId>
	<groupId>com.lxs</groupId>
	<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user-service</artifactId>
<dependencies>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 通用Mapper启动器 -->
<dependency>
	<groupId>tk.mybatis</groupId>
	<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
<!-- mysql驱动 -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>

四、服务调用者

调用 user-service 的功能,因此不需要Mybatis相关依赖了

编写代码

@SpringBootApplication
public class ConsumerApplication {
	public static void main(String[] args) {
	SpringApplication.run(ConsumerApplication.class, args);
}
@Bean
public RestTemplate restTemplate(){
	return new RestTemplate();
	}
}

五、Eureka注册中心

在这里插入图片描述

1.引入依赖

<project xmlns="HTTP://maven.apache.org/POM/4.0.0"
xmlns:xsi="HTTP://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="HTTP://maven.apache.org/POM/4.0.0
HTTP://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
	<artifactId>lxs-springcloud</artifactId>
	<groupId>com.lxs</groupId>
	<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-server</artifactId>
<dependencies>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>

2.启动类

//声明当前应用时Eureka服务
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(EurekaServerApplication.class, args);
}
}

3.编写配置

server:
	port: 10086
spring:
	application:
		name: eureka-server
eureka:
	client:
	service-url:
# eureka 服务地址,如果是集群的话;需要指定其它集群eureka地址
		defaultZone: HTTP://127.0.0.1:10086/eureka
# 不注册自己
	register-with-eureka: false
# 不拉取服务
	fetch-registry: false

4.服务注册

服务端添加依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

添加注册

通过添加 @EnableDiscoveryClient 来开启Eureka客户端功能

server:
port: 9091
spring:
	datasource:
		driver-class-name: com.mysql.jdbc.Driver
		url: jdbc:mysql://localhost:3306/springcloud
		username: root
		password: root
	application:
		name: user-service
mybatis:
	type-aliases-package: com.lxs.user.pojo
eureka:
	client:
		service-url:
			defaultZone: HTTP://127.0.0.1:10086/eureka
	instance:
			# 更倾向使用ip地址,而不是host名
		prefer-ip-address: true
		# ip地址
		ip-address: 127.0.0.1
	# 续约间隔,默认30秒
	lease-renewal-interval-in-seconds: 5
	# 服务失效时间,默认90秒
	lease-expiration-duration-in-seconds: 5

5.自我保护

在这里插入图片描述

eureka:
	server:
	enable-self-preservation: false # 关闭自我保护模式(缺省为打开)
	eviction-interval-timer-in-ms: 1000 # 扫描失效服务的间隔时间(缺省为60*1000ms)

六、负载均衡Ribbon

在这里插入图片描述

1.开启负载均衡

在RestTemplate的配置方法上添加@LoadBalanced 注解:

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
	return new RestTemplate();
}

2.修改调用方式

不再手动获取ip和端口,而是直接通过服务名称调用:

@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
	String url = "http://user-service/user/" + id;
	return restTemplate.getForObject(url, User.class);

为什么只输入了service名称就可以访问了呢?
之前还要获取ip和端口。显然是有组件根据service名称,获取到了服务实例的ip和端口。因为consumer-demo 使用的是RestTemplate,spring使用LoadBalancerInterceptor拦截器 ,这个类会在对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。

3.修改配置

user-service:
	ribbon:
		NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

//格式是: {服务名称}.ribbon.NFLoadBalancerRuleClassName ,值就是IRule的实现类。

七、Hystrix

Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务,防止出现级联失败。
Hystrix为每个依赖服务调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队,加速失败判定时间。用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,或者请求超时,则会进行降级处理。

1.服务降级

用户的请求故障时,不会被阻塞,更不会无休止的等待或者看到系统崩溃,至少可以看到一个执行结果(例如返回友好的提示信息) 。服务降级虽然会导致请求失败,但是不会导致阻塞,而且最多会影响这个依赖服务对应的线程池中的资源,对其它服务没有响应。
触发Hystrix服务降级的情况:
(1)线程池已满
(2)请求超时

2.引入依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

2.开启熔断

在启动类 ConsumerApplication 上添加注解:@EnableCircuitBreaker

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class ConsumerApplication {
// ...
}

在这里插入图片描述

在微服务中,经常会引入上面的三个注解,于是Spring就提供了一个组合注
解:@SpringCloudApplication

3.编写降级逻辑

@RestController
@RequestMapping("/consumer")
@Slf4j
@DefaultProperties(defaultFallback = "defaultFallback")
public class ConsumerController {
	@Autowired
	private RestTemplate restTemplate;
	@Autowired
	private DiscoveryClient discoveryClient;
	@GetMapping("{id}")
	//@HystrixCommand(fallbackMethod = "queryByIdFallback")
@HystrixCommand
public String queryById(@PathVariable Long id) {
	String url = "http://user-service/user/" + id;
	return restTemplate.getForObject(url, String.class);
}
public String queryByIdFallback(Long id) {
	log.error("查询用户信息失败。id:{}", id);
return "对不起,网络太拥挤了!";
}
public String defaultFallback() {
	return "默认提示:对不起,网络太拥挤了!";
}
}

4.服务熔断

在服务熔断中,使用的熔断器,也叫断路器,其英文单词为:Circuit Breaker 熔断机制与家里使用的电路熔断原理类似;当如果电路发生短路的时候能立刻熔断电路,避免发生灾难。在分布式系统中应用服务熔断后;服务调用方可以自己进行判断哪些服务反应慢或存状态在大量超时,可以针对这些服务进行主动熔断,防止整个系统被拖垮。Hystrix的服务熔断机制,可以实现弹性容错;当服务请求情况好转之后,可以自动重连。通过断路的方式,将后续请求直接拒绝,一段时间(默认5秒)之后允许部分请求通过,如果调用成功则回到断路器关闭状态,否则继续打开,拒绝请求的服务。

状态

Closed:关闭状态(断路器关闭),所有请求都正常访问。
Open:打开状态(断路器打开),所有请求都会被降级。Hystrix会对请求情况计数,当一定时间内失败请求
百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。
Half Open:半开状态,不是永久的,断路器打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会关闭断路器,否则继续保持打开,再次进行休眠计时。

八、Feign

1.引入依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.Feign的客户端

@FeignClient("user-service")
public interface UserClient {
	//http://user-service/user/123
	@GetMapping("/user/{id}")
	User queryById(@PathVariable("id") Long id);
}

//首先这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟Mybatis的mapper很像
//@FeignClient ,声明这是一个Feign客户端,同时通过 value 属性指定服务名称
//接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果
//@GetMapping中的/user,请不要忘记;因为Feign需要拼接可访问的地址
@RestController
@RequestMapping("/cf")
public class ConsumerFeignController {
	//注入了UserClient就相当于添加了url
	@Autowired
	private UserClient userClient;
	@GetMapping("/{id}")
	public User queryById(@PathVariable Long id){
		return userClient.queryById(id);
	}
}

九、Gateway

Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息,从而加强安全保护。Spring Cloud Gateway本身也是一个微服务,需要注册到Eureka服务注册中心。

1.核心概念

1、路由(route) 路由信息的组成:由一个ID、一个目的URL、一组断言工厂、一组Filter组成。如果路由断言为真,说明请求URL和配置路由匹配。
2、断言(Predicate) Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于HTTP Request中的任何信息比如请求头和参数。
3、过滤器(Filter) 一个标准的Spring WebFilter。 Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理

2.导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="HTTP://maven.apache.org/POM/4.0.0"
xmlns:xsi="HTTP://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="HTTP://maven.apache.org/POM/4.0.0 HTTP://maven.apache.org/xsd/maven4.0.0.xsd">
<parent>
	<artifactId>lxs-springcloud</artifactId>
	<groupId>com.lxs</groupId>
	<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>lxs-gateway</artifactId>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependencies>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>

2.编写启动类

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
	public static void main(String[] args) {
		SpringApplication.run(GatewayApplication.class, args);
	}
}

3.编写配置

server:
	port: 10010
spring:
	application:
		name: api-gateway
eureka:
	client:
		service-url:
			defaultZone: HTTP://127.0.0.1:10086/eureka
instance:
	prefer-ip-address: true

加了路由

server:
	port: 10010
spring:
	application:
		name: api-gateway
cloud:
	gateway:
		routes:
# 路由id,可以随意写
			- id: user-service-route
			# 代理的服务地址
			uri: HTTP://127.0.0.1:9091
			uri: lb://user-service
			# 路由断言,可以配置映射路径
			predicates:
				- Path=/user/**       /**/
			filters:
				# 添加请求路径的前缀
				- PrefixPath=/user
				# 表示过滤1个路径,2表示两个路径,以此类推
				- StripPrefix=1
eureka:
	client:
		service-url:
			defaultZone: HTTP://127.0.0.1:10086/eureka
instance:
	prefer-ip-address: true

十、分布式配置中心

搭建微服务中心

引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven4.0.0.xsd">
<parent>
	<artifactId>lxs-springcloud</artifactId>
	<groupId>com.lxs</groupId>
	<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>config-server</artifactId>
<dependencies>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
</project>

(1)启动类

@SpringBootApplication
@EnableConfigServer //开启配置服务
public class ConfigServerApplication {
	public static void main(String[] args) {
	SpringApplication.run(ConfigServerApplication.class, args);
}
}

(2)配置文件

server:
	port: 12000
spring:
	application:
		name: config-server
cloud:
	config:
		server:
			git:
				uri: https://gitee.com/lxsong77/lxs-config.git
eureka:
	client:
		service-url:
			defaultZone: http://127.0.0.1:10086/eureka

(3)服务器添加依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

(4)服务器修改配置

  1. 删除 user-service 工程的 user-service\src\main\resources\application.yml 文件(因为该文件从配置中心获取)
  2. 创建 user-service 工程 user-service\src\main\resources\bootstrap.yml 配置文件
spring:
	cloud:
		config:
# 要与仓库中的配置文件的application保持一致
			name: user
# 要与仓库中的配置文件的profile保持一致
			profile: dev
# 要与仓库中的配置文件所属的版本(分支)一样
			label: master
			discovery:
# 使用配置中心
				enabled: true
# 配置中心服务名
				service-id: config-server
# 配置rabbitmq信息;如果是都与默认值一致则不需要配置
rabbitmq:
	host: localhost
	port: 5672
	username: guest
	password: guest
eureka:
	client:
		service-url:
			defaultZone: http://127.0.0.1:10086/eureka

(5)改造用户微服务 user-service 项目的UserController

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值