本文最后更新于2 分钟前,文中所描述的信息可能已发生改变。
架构
- 单体架构
- 垂直架构
- 分布式架构
- SOA架构
- 微服务架构
注册中心
用于服务注册与服务发现。
- 实现:
- Eureka (Netflix)
- Consul (Google)
- Nacos (Alibaba)
SpringCloud Eureka部分
Ribbon组件
是一个进程间通信库,可以帮助我们发现服务,里面有实现客户端负载均衡的一些算法,也可自定义负载均衡规则。由 Netflix 开发。
使用:
- 导入依赖(在 spring-cloud-start-netflix-eureka-client 中包含此依赖)。xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
- 在配置类中 RestTemplate 的 @Bean 方法上面加上 @LoadBalanced 注解。
- 给RestTemplate传的URL中将ip和端口部分换为服务名,即
http://serviceName/xxx/x
形式即可。
OpenFeign组件
服务接口调用(底层使用了Ribbon),是一个声明式的 Rest 客户端,基于接口注解的方式可以让我们在客户端使用声明式的方式来调用服务而不需要使用 RestTemplate 来进行调用。可以设置日志输出与超时时间。
使用:
- 客户端导入依赖:xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
- 启动类上加注解:
@EableFeignClients
。 - 编写调用接口:java
@FeignClient("服务名")//RestTemplate的参数有了 public interface OrderFeign{ //此方法为controller中的方法 @GetMapping("/order/{id}") public Order findById(@PathVariable("id")Integer id); }
- 在需要调用服务的地方注入此接口并调用其方法即可。
Hystrix组件
是 Netflix 开源的延迟和容错库,提供了熔断功能,防止服务出现雪崩。
功能:
- 隔离:隔离各个服务的调用。
- 降级:调用方降级、服务方降级。为了使得更快的得到反馈。
- 熔断:一种机制,当调用失败次数达到阈值时会触发,使得整个服务都不可用。间隔一段时间后,当调用又能成功且成功次数达到阈值时则恢复。
- 限流:不用,一般在Nginx或网关中处理。
使用:
- 服务方降级:
- 服务方导入依赖(feign组件集成了):xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
- 编写降级方法java
//在controller中 public Order findById_fallback(Integer id){ //返回一个特殊对象提示调用方此服务出错了 return new Order(); }
- 在controller方法上使用
@HystrixCommand
注解配置降级方法@HystrixCommand(fallbackMethod = "findById_fallback")
- 启动类上开启Hystrix功能
@EnableCircuitBreaker
- 服务方导入依赖(feign组件集成了):
- 调用方降级
- 实现在调用方中定义的 OrderFeign 接口并重写其方法,并将实现类注入到容器中,重写后的方法被认为是降级方法。
- 在 OrderFeign 接口上的 @FeignClient 注解中使用 fallback 属性设置降级处理类
@FeignClient(name="服务名",fallback="实现类.class")
。 - 在 yml 中开启 feign 对 Hystrix 的支持。
ymlfeign: hystrix: enable: true
Gateway网关
具有路由、过滤、认证、鉴权等功能,类似一个切面。目前网关的解决方案有:Nginx+Lua、Netflix的Zuul/Zuul2、Spring Cloud Gateway。
- 使用:
- 依赖引入
xml
<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>
- 启动类上加上注解
@EableEurekaClient
- 配置文件
yml
server:
port: 9000
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: eureka-provider
# 静态路由
# uri: http://localhost:8081
# 动态路由
uri: lb://eureka-provider
predicates:
- Path=/order/**
filters: #内置局部过滤器
- AddResponseHeader=master1,holo
default-filters: #内置全局过滤器
- AddResponseHeader=my,zz
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://localhost:8761/eureka
- 过滤功能(自定义全局过滤器) 分为pre与post过滤器,即在网关转发之前执行与响应之前执行,可以让我们对请求与响应做一些处理。
java
@Component
public class IpFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
String ipAddress = request.getRemoteAddress().getAddress().getHostAddress();
System.out.println("ipAddress = " + ipAddress);
String badIp = "192.168.206.1";
if(badIp.equals(ipAddress)){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
return chain.filter(exchange);
}
//过滤器的执行顺序,返回值越小越先执行
@Override
public int getOrder() {
return 0;
}
}
SpringCloud Config配置中心组件
也是一个单独的web程序,可以将配置文件放置到远程仓库让服务去自行读取。
使用:
- 依赖引入
xml
<!--配置中心依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
- 启动类上使用注解
@EnableConfigServer
- 配置文件
yml
server:
port: 9010
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/LoveHelo/my-config-address.git # 远程仓库路径
label: master #分支名
- 需要读取配置文件的微服务中(该服务可以不需要加载本地的配置文件了)
- 依赖引入
xml<!--配置中心依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!--使得bootstrap.yml生效,因为新版本SpringCloud禁用了bootstrap--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
- bootstrap配置文件
ymlspring: cloud: config: uri: http://localhost:9010 # 配置中心的地址 name: provider #文件名 profile: dev # provider-dev.yml label: master # 分支
- 刷新客户端 可以导入以下依赖并在 controller 层的类上添加注解
@RefreshScope
,然后发送一个post请求到该客户端的路径http://ip:port/actuator/refresh
即可通知客户端刷新。可以使用curl工具发送:在cmd下输入curl -X POST http://localhost:8081/actuator/refresh
依赖导入:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置文件中添加:
yml
# 开启全部端点
management:
endpoints:
web:
exposure:
include: '*'
- 配置中心集成Eureka
- 配置中心引入
spring-cloud-starter-netflix-eureka-client
依赖,并在启动类上加上@EnableEurekaClient
,配置文件中指定注册中心的地址:
yml
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://localhost:8761/eureka
在客户端的 bootstrap.yml 文件修改为:
yml
spring:
cloud:
config:
# uri: http://localhost:9010 # 配置中心的地址,没有集成Eureka的使用
name: provider #文件名
profile: dev # provider-dev.yml
label: master # 分支
discovery:
enabled: true
service-id: config-server
management:
endpoints:
web:
exposure:
include: '*'