SpringCloud学习第一天
一、微服务远程调用方式(RestTemplate)
更详细的对于RestTemplate的说明参考这篇博客
基本使用流程如下:
1、将RestTemplate注册成bean使用
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced // 负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
//Todo 将负载均衡策略改为随机 全局修改了
// @Bean
// public IRule randomRule(){
// return new RandomRule();
// }
// @Bean
// public IRule nacosRule(){
// return new NacosRule();
// }
}
2、远程调用
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2、查询订单相关用户
User user = restTemplate.getForObject("http://localhost:8081/user/" + order.getUserId(), User.class);
order.setUser(user);
// 4.返回
return order;
}
3、微服务远程调用基本概念
一个服务,他即可能是服务提供者,也可能是服务消费者。
二、负载均衡过程
首先服务方需要完成注册,这样才可以在负载均衡时查询到所需要的服务具体地址,注册中心也会通过心跳检测注册的服务有没有挂掉,进行健康监控。
服务消费者请求来了之后,触发拦截器,获取其服务id,通过服务id去注册中心获取对应服务,在通过负载均衡策略,选择某个服务,与uri获取完整url路径发送请求。
三、Eureka注册中心
Eureka注册中心作用
1、构建Eureka服务端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
可以复制上文,也可以直接上Maven repository查询所需要的版本
2、@EnableEurekaService开启服务,RestTemplate添加负载均衡@LoadBalance注释
3、配置application.yml文件
spring: #配置服务名称
application:
name: eurekaServer
eureka:
client:
service-url: #配置eureka地址信息
defaultZone: http://127.0.0.1:10086/eureka
4、构建Eureka客户端
与上述相同,在需要注册的微服务模块导入client模块,是指相应的服务名称,在发送请求的时候服务名称即为上述的服务id,注册中心以此来搜索对应的注册服务。
具体使用:
四、Nacos注册中心
1、与Eureka注册中心对比
个人感觉Nacos注册中心更加强大,有单独的客户端对注册服务进行管理,这里就不说怎么配置了,可以自己搜索安装Nacos。
1、相较于Eureka,Nacos有临时实例(默认)和非临时实例,对于临时实例Nacos和Eureka一样通过心跳检测判断服务有没有宕机。而对于非临时实例,Nacos会主动询问检测服务是否宕机,速度要更快,并且检测到了也不会注销服务,只是将服务下线,下次服务启动时会在此开启。
2、Nacos有NacosRule负载均衡策略,可以设置就近集群服务,服务可以更迅速。
2、Nacos使用
# 配置nacos服务器地址
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
userService:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
# NacosRule负载均衡策略,这个策略会优先选择同集群的服务
具体的使用逻辑是一样的
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2、查询订单相关用户
// User user = restTemplate.getForObject("http://localhost:8081/user/" + order.getUserId(), User.class);
// order.setUser(user);
// 3、注册拉取
String url = "http://userService/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
order.setUser(user);
// 4.返回
return order;
}