1. 远程调用
通过RestTemplate实现基于http的远程调用:
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate () {
return new RestTemplate();
}
}
在controller中即可通过http地址调用其它服务的方法:
@Autowired
private RestTemplate restTemplate;
@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
// 根据id查询订单并返回
Order order = orderService.queryOrderById(orderId);
// 发起http请求
User user = restTemplate.getForObject("http://userservice/user/" + order.getUserId(), User.class);
order.setUser(user);
return order;
}
2. Eureka
Eureka是基于REST的服务发现框架,基本操作:
注 REST: Representational State Transfer,表现状态转移,是一种前后端分离的接口规范
- 每一个URI代表一种资源;
- 同一种资源有多种表现形式(xml/json);
- 所有的操作都是无状态的。
- 规范统一接口。
- 返回一致的数据格式。
- 可缓存(客户端可以缓存响应的内容)。
代码如下:
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
@Bean
public IRule randomRule() {
return new RandomRule();
}
}
3. Ribbon
为了:
如何在配置Eureka Client注册中心时不去硬编码Eureka Server的地址?
在微服务不同模块间进行通信时,如何不去硬编码服务提供者的地址?
当部署多个相同微服务时,如何实现请求时的负载均衡?
因此,Ribbon是一个客户端负载均衡器,基本原理如图:
可以通过实现IRule接口实现全局的负载均衡策略:
7种负载均衡策略:
- RoundRobinRule: 轮询
- ZoneAvoidanceRule: 区域敏感策略(默认),根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,即为轮询。
- WeightedResponseTimeRule: 权重策略,刚开始使用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大
- RandomRule: 随机
- BestAvailableRule: 最小并发数策略,遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最小连接数,那么会调用轮询策略进行选取。
- RetryRule: 重试策略,轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null
- AvailabilityFilteringRule: 可用敏感性策略,先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例
@Bean
public IRule randomRule() {
return new RandomRule();
}
也可以通过配置文件指定某微服务的负载均衡策略:
userservice: # 服务名
ribbon:
NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- 懒加载:Ribbon会在首次访问时去创建负载均衡器,后续可以直接访问。这会造成一定的速度差异和某些bug,可以启用饥饿加载,即服务启动时拉取服务列表解决:
ribbon:
eager-load:
enabled: true
clients: userservice # 指定对userservice启用饥饿加载
- userservice # 指定多个服务时换行加-
- orderservice
4. Nacos
我人傻了…公司的jdk安装包只有jre,合着我用了这么久的open jdk o(╥﹏╥)o 赶紧重装一个
…
解决了,继续继续
nacos是阿里巴巴的注册中心,单机模式记得改startup.cmd
中的配置为standalone
,使用nacos就要把eureka的配置都注掉,两者都遵循spring cloud Commons。
使用nacos:
// 单机模式启动nacos
E:\nacos\bin>startup.cmd -m standalone
// 父项目引入依赖
<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>
// 子项目引入服务发现依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
// 子项目yml配置地址
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
discovery:
cluster-name: BJ # 集群名称
即可在8848端口进入nacos管理界面
localhost:8848
4.1 服务多级存储模型
优先访问本地集群,跨地区调用延迟较高,通过cluster-name配置集群名称