SpringCloud
分析说明:
Eureka是服务注册中心,只做服务注册;自身并不提供服务也不消费服务。可以搭建web工程使用Eureka,可以使用Spring Boot方式搭建
启动器依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
application.yml配置文件:
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
启动引导类注解:

EurekaClient 将自己注册到EurekServer,并从EurekaServer获取服务列表进行远程调用
注册服务(服务的提供者)
发现服务(服务的调用者)
通过注解注明Eureka客户端发现功能

其主要配置不同端口;

负载均衡是一个算法,可以通过该算法实现从地址列表中获取一个地址进行服务调用
Ribbon提供了轮询、随机两种负载均衡算法(默认是轮询)可以实现从地址列表中使用负载均衡算法获取地址进行服务调用
Ribbon的负载均衡通过RestTemplate远程调用实现:
在实例化RestTemplate的时候使用@LoadBalanced,服务地址直接可以使用服务名。

3,客户端负载均衡——Feign:
Feign主要作用:自动根据参数拼接http请求地址。
Feign基于以上的客户端负载均衡Ribbon进行优化封装,即:Ribbon+RestTemplate
实现步骤:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
-
编写Feign客户端 @FeignClient开启Feign功能
//声明当前类是一个Feign客户端,指定服务名为user-service
@FeignClient("user-service")
public interface UserClient {
//http://user-service/user/123
@GetMapping("/user/{id}")
User queryById(@PathVariable Long id);
}
3,编写一个处理器ConsumerFeignController,注入Feign客户端并使用
@RestController
@RequestMapping("/cf")
public class ComsumerFeignController {
//通过Feign实现远程调用
@Autowired
private UserClient userClient;
@GetMapping("/{id}")
public User findById(@PathVariable Long id) {
return userClient.findById(id);
}
}
4,熔断器——Netflix Hystrix:
熔断器的作用:某个服务的单个点的请求故障会导致用户的请求处于阻塞状态,最终的结果就是整个服务的线程资源消耗殆尽。
由于服务的依赖性,会导致依赖于该故障服务的其他服务也处于线程阻塞状态,最终导致这些服务的线程资源消耗殆尽 直到不可用,
从而导致整个问服务系统都不可用,即产生雪崩效应
Hystrix解决雪崩效应:
-
线程隔离:用户请求不直接访问服务,而是使用线程池中空闲的线程访问服务,加速失败判断时间。
-
服务降级:及时返回服务调用失败的结果,让线程不因为等待服务而阻塞。
熔断器原理:

通过配置服务熔断参数修改默认:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000
circuitBreaker:
errorThresholdPercentage: 50 # 触发熔断错误比例阈值,默认值50%
sleepWindowInMilliseconds: 10000 # 熔断后休眠时长,默认值5秒
requestVolumeThreshold: 10 # 熔断触发最小请求次数,默认值是20
引入坐标
pom.xml spring-cloud-starter-netflix-hystrix
引导类上加
@SpringCloudApplication
@EnableFeignClients //开启Feign功能
public class ComsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ComsumerApplication.class, args);
}
服务调用者的Controller类中提供一个降级服务的方法
方案一:写在方法上
@HystrixCommand(fallbackMethod="methodName")
方案二:降级服务的方法抽取出去,让所有的方法使用
写在Controller类上@DefaultProperties(defaultFallback = "methodName")
Controller的方法上, @HystrixCommand
降级服务的方法要和原方法的参数和返回值要一致。
closed : 调用的是原有的服务(method) open 调用的是降级服务(method) half open 尝试调用原有的服务,如果能调通,将熔断的状态改为closed,如果调不通,还是保持open状态
5.服务网关——Netflix Gateway(Zuul):

引入坐标
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
配置文件
server:
port: 10010
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
# 路由id,可以任意
- id: user-service-route
# 代理的服务地址
uri: http://127.0.0.1:9091
# 路由断言: 可以匹配映射路径
predicates:
- Path=/user/**
# Gateway网关地址
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
instance:
prefer-ip-address: true
面向服务路由:
提供服务的地址:http://127.0.0.1:9091/user/8
-
添加前缀:对请求地址添加前缀路径之后再作为代理的服务地址;
http://127.0.0.1:10010/8 --> http://127.0.0.1:9091/user/8 添加前缀路径/user
-
去除前缀:将请求地址中路径去除一些前缀路径之后再作为代理的服务地址;
http://127.0.0.1:10010/api/user/8 --> http://127.0.0.1:9091/user/8 去除前缀路径/api
总结:
客户端的请求地址与微服务的服务地址如果不一致的时候,可以通过配置路径过滤器实现路径前缀的添加和去除。
注:由于作者对Spring Cloud Config 与 Spring Cloud Bus掌握不深,暂不概述
