赞
踩
通过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;
}
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();
}
}
为了:
如何在配置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:
eager-load:
enabled: true
clients: userservice # 指定对userservice启用饥饿加载
- userservice # 指定多个服务时换行加-
- orderservice
我人傻了…公司的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
优先访问本地集群,跨地区调用延迟较高,通过cluster-name配置集群名称
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。