第一天:微服务(20220321)
基于RestTemplate发起的http请求实现远程调用
http请求做远程调用是与语言无关的调用,只要知道对方的IP、端口、接口路径
01.微服务远程调用
1.注册RestTemplate,在order-servcie中的OrderApplication中注册RestTemplate
package cn.itcast.order;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 注入RestTemplate,并且交给Spring管理
* @return
*/
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2.服务远程调用RestTemplate,修改order-service中的OrderService的queryOrderById方法:
@Resource
private OrderMapper orderMapper;
@Resource
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
String url = "http://localhost:8081/user/"+order.getUserId();
//2.查询用户
User user = restTemplate.getForObject(url, User.class);
//3.封装user信息
order.setUser(user);
// 4.返回
return order;
}
02.服务调用关系
- 服务提供者:暴露接口给其他微服务调用
- 服务消费者:调用其他微服务提供的接口
- 提供者与消费者的角色是相对的
- 一个服务可以同时是服务提供者和服务消费者
03 Eureka注册中心
在Eureka架构中,微服务角色有两类:
- EurekaServer:服务端,注册中心
- 记录服务信息
- 心跳监控
- EurekaClient:客户端
- Provider:服务提供者。例如案例中的user-service
- 注册自己的信息到EurekaServer
- 每间隔30s向Eureka发送心跳
- consumer:服务消费者。例如案例中的order-service
- 根据服务名称从EurekaServer中拉取服务列表
- 基于服务列表做负载均衡,选中一个微服务后发起远程调用
- Provider:服务提供者。例如案例中的user-service
搭建EurekaServer(20220322)
- 引入eureka-server依赖
- 添加@EnableEurekaServer注解
- 在application.yml中配置Eureka地址
- 服务注册
- 引入eureka-client依赖
- 在application.yml中配置Eureka地址
- 服务发现
- 引入eureka-client依赖
- 在application.yml中配置Eureka地址
- 给RestTemplate添加@loadBalanced注解
- 用服务提供者的服务名称远程调用
04 Ribbon负载均衡
- 规则接口是IRule
- 默认实现是ZoneAvoidanceRule,根据zone选择服务列表,然后轮询
设置ribbon负载均衡的两种方式:
- 代码方式:在order-service中的OrderApplication类中,定义一个新的Rule:
(配置灵活,但修改时需要重新打包发布)
@Bean
public IRule randomRule(){
return new RandomRule();
}
- 配置文件方式:在order-service中的application.yml中,添加新的配置:
(直观、方便 - 无需重新打包发布,但是无法做全局配置)
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
Ribbon饥饿加载
ribbon:
eager-load:
enabled: true
clients: userservice
#- userservice 多个服务
#- xxservice
05 Nacos注册中心
- 服务搭建:
- 下载安装包
- 解压
- 运行startup.cmd -m standalone(单机启动)
- Nacos服务注册或发现
- 引入nacos.discovery依赖
- 配置nacos地址spring.cloud.nacos.server-addr:localhost:8848
Nacos服务分级模型
- Nacos服务分级存储模型
- 一级是服务,例如userservice
- 二级是集群,例如杭州或上海
- 三级是实例,例如杭州机房某台部署了userservice的服务器
- 如何设置实例的集群属性
- 修改application.yml文件,添加spring.cloud.nacos.discovery.cluster-name属性(配置集群)
- 修改application.yml文件,添加spring.cloud.nacos.discovery.cluster-name属性(配置集群)
Nacos环境隔离
- namespace用来做环境隔离
- 每个namespace都有唯一ID
- 不同namespace下的服务不可见
Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式(压力大)
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除(等待恢复 )
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式