springcloud-netflix及微服务
springcloud-netflix
分布式系统理论
若干个独立系统的集合,这些计算机对用于来说就像单个相关系统
分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。
目标:为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。
其目的是利用更多的机器,处理更多的数据。
RPC
rpc同样是一种基于http的应用层的通信协议
远程过程调用。
微服务架构的核心问题
由于网络的不可靠
- 路由问题
- 微服务之间的通信 (HTTP, RPC)
- 注册和发现
- 熔断机制
微服务概念
srpingcloud
创建项目
基础依赖
- 配置依赖
打包方式为pom
主文件中的依赖使用 dependencyManagement标签;这样在子工程中可以不填写依赖版本,默认为主工程的依赖版本
提供方
- 配置子项目的mybitas
mybatis-config.xml(配置文件) 和 mapper文件(定义查询语句)- spring的配置
- service层 control层
- applicaton 启动类
消费者
- 依赖web相关的 不需要连数据库
- 配置文件
只需要一个端口号- 配置springboot中的bean即applicationsContet.xml
- Control层
使用RestTemplate来调用生产者的标准化的Restful服务
getForObject 接收参数,(请求地址, [传递参数], 返回值类型)
Eureka(服务注册与发现)
cs架构
3大角色:Eureka Server 提供服务的注册与发现。zookeeper
Eureka服务端编写
- application.yml配置文件
defaultZone: 注册地址- application启动类
Eureka客户端
将服务提供方的服务注册到Eureka中
- 在application.yml配置文件中添加 eureka相关的配置
info为展示项目信息,可以省略
- 在当前服务的application主启动类中启动eurekaclient功能。
@nableEurekaClient
在服务启动之后会自动注册到EurekaServer中。之后在 Instances 列表中可以看到注册进来的服务。
自我保护机制,避免错误删除微服务
eureka相关api
获取微服务清单
需要开启 DiscoveryClient功能
eureka集群
eureka服务端
配置上其他节点
服务提供端的配置
相互注册成功之后,可以在DS Replicas
相互看到其他的eureka节点
分布式系统的cap原则
C(Consistency) 强一致性
A(Availability)可用性
P(Partition tolerace)分区容错性
Zookeeper保证的是CP
Eureka保证的是AP
ribbon
主要用于服务的负载均衡。ribbon客户端组件提供了一系列配置项:链接超时、重试等
负载均衡:
集中式:nginx(反向代理);进程式:ribbon、dns(由客户端决定)
客户端配置ribbon
- 导入ribbon及eureka依赖
- 在客户端中配置eureka,主启动项中开启eureka功能
- 在getRestTemplate中添加Rabbin的负载均衡
- 将请求地址修改为eureka中对应的服务名称,来访问指定的服务;
rabbin自定义负载均衡
feign
面向接口编程
对接
- 导入依赖
定义接口
添加注解。并手动指定包的位置,并为feign客户端指定包的位置
调用方 - 启动feignClient
调用方使用
本质还是调用了eureka,只是增加了代码的可读性。
Hystix
服务熔断
针对服务端做的处理,代码写在服务端
服务降级
针对客户端做的处理,代码写在客户端中。即使服务提供方被关闭,客户端取访问的时候仍然可以获取默认的返回值
代码实现
- 在application.yml配置文件中开启feign.hystrix
- 实现错误返回工厂方法
- 在调用方的接口中指定错误返回工厂方法
监控
- 监控服务导入依赖
- 监控服务 开启监控
- 保证服务端都有监控依赖
- 服务端增加监控的代理服务
Zuul(路由网关)
- 项目配置 application.yml
- 启动项目
将微服务地址隐藏起来
config
配置服务端
- 导入依赖
- 配置application.yml文件
- 开启config功能
- 在远程仓库中配置application.yml文件
- 验证可以获取对应配置内容
curl http://localhots:3344/application-dev.yml
配置客户端
- 导入依赖
- 配置客户端bootstrap.yml(系统级别的配置,防止被远程配置覆盖掉)
配置application.yml文件(用户级别的配置)
uri: config服务端地址;name: 文件名称;profile: 哪个环境- 启动类
- controller层