基于RestTemplate发起的http请求实现远程调用
http请求做远程调用是与语言无关的调用,只要知道对方的IP、端口、接口路径
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);
}
@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中拉取服务列表基于服务列表做负载均衡,选中一个微服务后发起远程调用 搭建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选择服务列表,然后轮询
代码方式:在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属性(配置集群)
Nacos环境隔离
namespace用来做环境隔离每个namespace都有唯一ID不同namespace下的服务不可见 Nacos与eureka的共同点
都支持服务注册和服务拉取都支持服务提供者心跳方式做健康检测 Nacos与Eureka的区别
Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式(压力大)临时实例心跳不正常会被剔除,非临时实例则不会被剔除(等待恢复 )Nacos支持服务列表变更的消息推送模式,服务列表更新更及时Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式



