JavaWeb_SpringCloud微服务_Day1-eureka, ribbon, nacos
认识微服务
微服务技术对比
Dubbo | SpringCloud | SpringCloudAlibaba | |
---|---|---|---|
注册中心 | zookeeper, Redis | Eureka, Consul | Nacos, Eureka |
服务远程调用 | Dubbo协议 | Feign(http协议) | Dubbo, Feign |
配置中心 | 无 | SpringCloudConfig | SpringCloudConfig, Nacos |
服务网关 | 无 | SpringCloudGateway, Zuul | SpringCloudGateway, Zuul |
服务监控和保护 | dubbo-admin, 功能弱 | Hystrix | Sentinel |
分布式服务架构案例
远程调用
-
注册RestTemplate
java/** * 创建RestTemplate并注入Spring容器 * @return */ @Bean public RestTemplate restTemplate(){ return new RestTemplate(); }
-
服务远程调用RestTemplate
java@Autowired private RestTemplate restTemplate; public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); // 2. 利用RestTemplate发起http请求, 查询用户 // 2.1 url路径 String url = "http://localhost:8081/user/"+order.getUserId(); // 2.2 发送http请求, 实现远程调用 User user = restTemplate.getForObject(url, User.class); // 3 封装user到order order.setUser(user); // 4.返回 return order; }
eureka注册中心
原理
在Eureka架构中, 微服务角色有两类:
- EurekaServer: 服务端, 注册中心
- 记录服务信息
- 心跳监控
- EurekaClient: 客户端
- Provider: 服务提供者
- 注册自己的信息到EurekaServer
- 每隔30秒向EurekaServer发送心跳
- Consumer: 服务消费者
- 根据服务名称从EurekaServer拉取服务列表
- 基于服务列表做负载均衡, 选中一个微服务后发起远程调用
- Provider: 服务提供者
搭建EurekaServer
-
引入eureka-server依赖
xml<!-- eureka服务端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
-
添加@EnableEurekaServer注解
java@EnableEurekaServer @SpringBootApplication public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
-
在application.yml中配置eureka地址
ymlserver: port: 10086 spring: application: name: eurekaserver eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka/
服务注册
-
引入eureka-client依赖
xml<!-- eureka客户端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
在application.yml中配置eureka地址
-
启动多个实例: 右键服务copy configuration, 在启动项vm option中修改端口号
服务发现
-
给RestTemplate添加@LoadBalanced注解, 负载均衡
java@LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
-
用服务提供者的服务名称远程调用
java// String url = "http://localhost:8081/user/"+order.getUserId(); String url = "http://userserver/user/"+order.getUserId();
Ribbon负载均衡
修改负载均衡
-
代码方式 (全体)
java/** * 更换负载均衡策略为随机 * @return */ @Bean public IRule randomRule() { return new RandomRule(); } ```erer
-
配置文件方式 (只针对某个微服务)
ymluserserver: # 给某个微服务配置负载均衡规则,这里是userserver服务 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
饥饿加载
-
Ribbon默认是采用懒加载, 即第一次访问时才会创建LoadBalanceClient, 请求时间很长.
-
饥饿加载在项目启动时创建, 降低第一次访问的耗时
ymlribbon: eager-load: # 饥饿加载 enabled: true clients: userserver # 指定服务
nacos注册中心
快速入门
-
父工程添加spring-cloud-alibaba管理依赖
xml<!-- nacos的管理依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
-
nacos客户端依赖
xml<!-- nacos客户端依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
配置文件
ymlspring: cloud: nacos: server-addr: localhost:8848 # nacos服务地址
-
集群配置
ymlspring: cloud: nacos: server-addr: localhost:8848 # nacos服务地址 discovery: cluster-name: SH # 集群地址
-
NacosRule负载均衡策略
ymluserserver: # 给某个微服务配置负载均衡规则,这里是userservice服务 ribbon: # NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
- 优先选择同集群服务实例列表
- 本地集群找不到提供者, 才去其他集群寻找, 并且会报警告
- 确定了可用实例列表后, 再采用随机负载均衡挑选实例
-
命名空间
ymlspring: cloud: nacos: discovery: namespace: xxx # 命令空间
- namespace用来做环境隔离
- 每个namespace都有唯一id
- 不同namespace下的服务不可见
eureka和nacos对比
-
nacos非临时实例
ymlspring: cloud: nacos: discovery: ephemeral: false # 设置为非临时实例
-
nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
-
nacos与eureka的区别
- nacos支持服务端主动检测提供者状态: 临时实例采用心跳模式, 非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除, 非临时实例则不会被剔除
- nacos支持服务列表变更的消息推送模式, 服务列表更新更及时
- nacos集群默认采用ap方式(强调数据的可用性), 当集群中存在非临时实例时, 采用cp模式(强调数据的可靠性和一致性); eureka采用ap方式
来源
黑马程序员. SpringCloud微服务