基于RestTemplate发起的http请求实现远程调用
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.使用RestTemplate发起Http请求,实现远程调用
// 将响应的结果反序列化为User对象
String url = "http://localhost:8081/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
// 3.填充
order.setUser(user);
// 4.返回
return order;
}
}
每一个服务启动的时候都会在Eureka注册中心进行注册信息。
Consumer调用Provider的时候,会在注册中心拉取,Provider的注册信息。
每一个服务每隔30s都会向Eureka发一次心跳请求,报告健康状态,如果不跳了,Eureka就会删除其注册信息。
新建一个maven模块,添加依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
<version>3.0.3version>
dependency>
启动类
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
配置文件
server:
port: 10086
spring:
application: # 服务名称
name: eureka_server
eureka:
client:
service-url: # eureka自己的地址信息 (eureka也会把自己的信息注册进去)
defaultZone: http://localhost:10086/eureka
启动该模块,就能看到这样的信息

<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
<version>3.0.3version>
dependency>
spring:
application:
name: orderService # 服务名称不能使用下划线
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
基于服务名称来进行拉取
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// String url = "http://localhost:8081/user/" + order.getUserId();
// 将IP地址和端口号改为服务名称
String url = "http://userService/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
// 3.填充
order.setUser(user);
// 4.返回
return order;
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
实现原理:
发起请求后会被LoadBalancerInterceptor负载均衡拦截器所拦截,将服务名称提取交给RibbonLoadBalancerClient处理。
RibbonLoadBalancerClient依据服务名称从DynamicServerListLoadBalancer中获取真实的IP地址端口号列表,再依据IRule
负载均衡策略,去选择一个最终的。
调整负载均衡策略:
第一种方式:作用是全局的
@Bean
public IRule randomRule(){
return new RandomRule();
}
第二种方式:针对某个服务
userService:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
Ribbon默认采用懒加载,第一次访问时才会创建LoadBalanceClient,请求时间会较长。
饥饿加载会在项目启动时创建,降低第一次访问的耗时
ribbon:
eager-load:
enabled: true
clients: userService # 针对的服务