原来的远程调用出现的问题:

public Order queryOrderById(Long orderId) {
        // 1. 查询订单
        Order order = orderMapper.findById(orderId);
        // 2. 利用 RestTemplate 发送 http 请求,查询用户信息
        // 2.1 设置 url 地址
        String url = "http://localhost:9091/user/"+ order.getUserId();
        // 2.2 发送 Http 请求,实现远程调用
        User user = restTemplate.getForObject(url, User.class);
        // 2.3 封装 user 到 Order 中
        order.setUser(user);
        // 4. 返回
        return order;
    }

每次的服务地址端口会都是相同的,但是如果以后我们使用集群的话,这样就会产生问题。如果有多个服务提供者,消费者该如何选择?消费者如何得知服务提供者的健康状况?image.png

# Eureka 详解

eurekaService: 服务端,注册中心

  • 记录服务信息
  • 心跳监控

eurekaClient: 客户端

  • Provider: 服务提供者,例如上图中 user-service
    • 注册自己的信息到 EurekaService
    • 每隔 30 秒向 EurekaService 发送心跳
  • consumer: 服务消费者,例如上图中 order-service
    • 根据服务名称从 EurekaService 拉取服务列表
    • 基于服务列表做负载均衡,选中一个微服务后发起远程调用

搭建 EurekaService 环境 1、创建项目引入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

2、编写启动类,添加 **@EnableEurekaService** 注解

@EnableEurekaServer // 开启 Eureka 服务
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
}

3、添加 application.yml 文件,编写配置

server:
  port: 9092 # 服务端口
#  服务注册
spring:
  application:
    name: eurekaserver
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9092/eureka/

# 报错

同样的配置,这样我们启动时会报错,报错原因是连接被拒绝。** 原因:是因为 eureka 默认会去检索服务,当我们只写了这么一个注册中心(eureka)而没有其他服务的时候,它去检索服务就会出现上述错误。所以需要添加配置 fetch-registry: false。当我们配置多个服务时,我们要去掉这个。** 我们点击image.png 跳转的界面是:image.png 这里显示注册到 Eureka 中的实例。服务注册:1、创建项目引入依赖

<!--注册eureka的客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

2、在 application.yml 中配置 eureka 地址 (注意端口号与服务端端口号一致)

eureka:
  client:
    service-url:
      defaultZone: http://localhost:9092/eureka/

服务发现:我们只需在 RestTempleate 的 bean 上加上负载均衡注解即可完成负载均衡

@Bean
@LoadBalanced // 添加负载均衡注解
public RestTemplate restTemplate(){
    return new RestTemplate();
}

在拉取时,我们的 url 不能写死,我们需要写服务名称即可image.png 这样我们配置多个服务时,我们依靠 Eureka 注册中心就能拉取相应的服务了

总结一波:1、搭建 EurekaServer

  • 引入 eureka-server 依赖
  • 添加 @EnableEurekaServer 注解
  • 在 application.yml 中配置 eureka 地址

2、服务注册

  • 引入 eureka-client 依赖
  • 在 application.yml 中配置 eureka 地址

3、服务发现

  • 引入 eureka-client 依赖
  • 在 application.yml 中配置 eureka 地址
  • 给 RestTemplate 添加 @LoadBalanced 注解
  • 给服务提供者的服务名称远程调用