SpringCloud微服务注册中心、网关开发
1,微服务的概念
微服务架构风格是一种使用系列微小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,成为独立的业务。
每个服务基于业务能力构建,服务之间采用轻量级机制进行通信,通常是HTTP API,这些服务通过自动化部署机制进行独立部署。
每个服务使用不同的编程语言实现,以及不同的数据存储技术,并保持分布式管理。
2,SpringCloud
- Spring Cloud是一个开发工具集,包含多个子项目,极大的简化了微服务的开发
- 基于Spring boot进行开发
- 对Netflix开源组件的封装
- 为微服务开发提供一站式解决方案,是一组独立组件(中间件)的集合
3,注册中心Eureka
- Netflix Eureka 是Spring Cloud微服务注册发现的基础组件
- 提供了基于RESTful风格的服务注册与发现机制
4,Eureka Server开发步骤
- 导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 配置注解
@EnableEurekaServer 开启Eureka server 注册中心
- 配置yml
server:
port: 8761
spring:
application:
name: regist #服务ID
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka #向注册中心进行注册的服务地址
register-with-eureka: false #是否向注册中心进行注册
fetch-registry: false #是否获取注册服务的信息
server:
enable-self-preservation: false #关闭自我保护机制
5、Eureka Client开发
- 导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 配置注解
@EnableEurekaClient 开启Eureka Client
- 配置yml文件
server:
port: 端口
spring:
application:
name: 服务ID
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
6,网关组件 ZUUL
Gateway的作用是为客户端提供了统一的访问入口。服务端负载均衡组件。
- 导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
-
配置注解
@EnableEurekaClient @EnableZuulProxy //开启网关
-
配置yml
server:
port: 端口
spring:
application:
name: 服务ID
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka ##注册Eureka Server地址
zuul:
routes:
goodservice: /自定义路径/** ##自定义路由规则
7.微服务间通信
1)内置RestTemplate,基于Http协议的服务调用。
getForObject()
getForEntity()
2) Spring Cloud Ribbon 提供客户端负载均衡的能力。
3)OpenFeign
- 导入依赖
- 开启 @EnableFeignClient
- @Feign
8,注册中心高可用
- 配置Eureka集群,由多个Eureka实例提供服务,实现高可用。
- 多个实例进行互相注册
server:
port: 8761
eureka:
client:
service-url:
defaultZone: http://localhost:8762/eureka
fetch-registry: true
register-with-eureka: true
server:
port: 8762
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
fetch-registry: true
register-with-eureka: true
- Eureka Client 同时向多个Eureka实例进行注册,多个实例之间采用逗号分隔
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka
9.Ribbon负载均衡策略
- BestAvailableRule:选择最小并发请求的实例
- RandomRule:随机选择一个服务实例
- RoundRobinRule:轮询方式(默认)
配置轮训策略
- 局部
userservice: #这是你的服务ID
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- 全局
@Bean
public IRule ribbonRule(){
return new RandomRule();
}
10,OpenFeign整合了Ribbon及Hystrix
- 配置服务轮训的策略,与Ribbon的配置方式相同
11,Hystrix熔断器
SpringCloud Hystrix熔断器是一种防御机制,避免因服务调用失败发生雪崩效应。
-
RestTemplate实现服务降级步骤:
- 导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
- 开启服务降级,在启动类上配置
@EnableCircuitBreaker //启用服务降级
- 需要使用 @HystrixCommand注解来定义服务降级,并指定服务降级调用的方法
@GetMapping("/getUser/{id}") @HystrixCommand(fallbackMethod = "getUserFallback") public CommonResult getUser(@PathVariable("id") int id){ return restTemplate.getForObject(userServiceUrl+"/getUser/{1}",CommonResult.class,id); } public CommonResult getUserFallback(int id){ return CommonResult.failed(); }
-
OpenFeign实现服务降级步骤:
- 由于OpenFeign整合了Ribbon及Hystrix ,不需要额外导入依赖
- 配置application.yml;开启服务降级
feign: hystrix: enabled: true # 启用服务降级
- 需要为远程调用的接口添加默认降级的实现类
- 在调用的接口中,配置降级服务的实现
@FeignClient(value = "user-service",fallback = UserServiceClientFallback.class)
触发降级的条件
超时降级问题的解决
默认情况下,hystrix默认的超时时间是1S,超过这个时间就会触发降级。
connectTimeout 连接时间
readTimeout 业务处理(读取)时间
熔断时间>=总时间(连接+业务处理)
feign:
hystrix:
enabled: true # 启用服务降级
client:
config:
default:
connectTimeout: 500
readTimeout: 500
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 1000
- 熔断器的配置
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 1000
circuitBreaker:
requestVolumeThreshold: 20 #最近调用次数
sleepWindowInMilliseconds: 5000 #熔断持续时间
errorThresholdPercentage: 50 #请求错误率
metrics:
rollingStats:
timeMilliseconds: 10000 #滑动窗口期
12, Hystrix dashboard 监控仪表盘
使用步骤
-
创建一个独立的监控服务
- 导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency>
-
开启监控
@SpringBootApplication @EnableDiscoveryClient @EnableHystrixDashboard // 开启监控仪表盘 public class HystrixDashboardServiceApplication { public static void main(String[] args) { SpringApplication.run(HystrixDashboardServiceApplication.class, args); } }
-
对需要被监控的客户端应用,进行配置
- 导入依赖
<dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-metrics-event-stream</artifactId> <version>1.5.18</version> </dependency>
-
注册提供暴露数据的Servlet
@Bean public ServletRegistrationBean registrationBean(){ HystrixMetricsStreamServlet servlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean bean = new ServletRegistrationBean(); bean.addUrlMappings("/hystrix.stream"); bean.setLoadOnStartup(1); bean.setName("HystrixMetricsStreamServlet"); bean.setServlet(servlet); return bean; }