• SpringCloud学习(二)——Eureka注册


    1. Eureka 出现原因

    1.1 远程调用出现的问题

    服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
    服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

    远程调用有几个问题不得不进行考虑,如下

    • 服务消费者该如何获取服务提供者的地址信息?
    • 如果有多个服务提供者,消费者该如何选择?
    • 消费者如何得知服务提供者的健康状态?

    1.2 Eureka注册中心

    Eureka注册中心就是为了解决这些问题才出现的,Eureka的作用可以在下图中体现出来。
    在这里插入图片描述
    针对上面的三个问题,Eureka用下面的方式进行解决:

    • 服务消费者该如何获取服务提供者的地址信息?在Eureka中,服务提供者启动时向eureka注册自己的信息,eureka保存这些信息。消费者根据服务名称向eureka拉取提供者信息。

    • 如果有多个服务提供者,消费者该如何选择?如果存在多个可用的服务提供者,服务消费者利用负载均衡算法,从服务列表中挑选一个,该算法我们将会在后面讲到。

    • 消费者如何得知服务提供者的健康状态?服务提供者会每隔30秒向Eureka Server发送心跳请求,报告健康状态,eureka会更新记录服务列表信息,心跳不正常会被剔除消费者就可以拉取到最新的信息。

    2. 搭建Eureka注册中心

    这里我们继续使用前面的案例来进行示范。

    2.1 创建模板

    在最顶级的目录中创建一个新的Module,如下所示。
    在这里插入图片描述
    然后选择Spring模板,如下:
    在这里插入图片描述
    之后勾选Eureka Server,完成模板的创建。
    在这里插入图片描述

    2.2 添加依赖

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    并且在启动类前面加上注释 @EnableEurekaServer,如下

    @EnableEurekaServer
    @SpringBootApplication
    public class EurakeServeApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurakeServeApplication.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.3 配置文件

    在springboot的配置文件中对其进行配置,配置信息如下:

    server:
      port: 10086
    spring:
      application:
        name: eurekaserver
    eureka:
      client:
        service-url:
          # Eureka的注册中心地址
          defaultZone: http://127.0.0.1:10086/eureka/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.4 Eureka测试

    运行上面的微服务,打开对应的地址 http://localhost:10086/ 可以得到下面的场景
    在这里插入图片描述

    在这些信息中,最重要的就是红框中的信息,代表着微服务的注册和中心和提供者。

    2. 服务注册

    接下来我们就可以尝试将微服务提供者注册到Eureka了。

    2.1 导入依赖

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    注意:,注入的依赖一定要有spring-cloud-starter-netflix-eureka-client,而不能光是spring-cloud-netflix-eureka-client,这个坑我替你们踩了。

    2.2 配置文件

    在配置文件中进行配置,配置如下:

    spring:
      application:
        name: userserver
    eureka:
      client:
        service-url:
          # Eureka的注册中心地址
          defaultZone: http://127.0.0.1:10086/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意上面的 spring.application.name 的名字内容要变。

    2.3 测试

    重启微服务进行测试,打开 http://localhost:10086/,看到如下画面
    在这里插入图片描述
    发现注册的Serve全在里面,表示注册成功。

    3. 一个服务启动多实例测试

    点击微服务启动的右键,选择 Copy Configuration
    在这里插入图片描述
    如果完全复制的话会产生端口冲突,这里修改第二个实例的端口,如下图

    在这里插入图片描述
    点击OK或者Apply后,在Not Started 下面就会出现UserService的另一个实例,将其启动。
    在这里插入图片描述
    运行后在Eureka注册中心查看,可以看到有两个UserServer实例。
    在这里插入图片描述

    4. 服务发现

    首先在Order的启动类中添加负载均衡 @LoadBalanced 的注解,如下

    @Bean
    @SpringBootApplication
    public class OrderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    然后将访问的地址进行改变,变为 "http://userserver/user/id"

    @GetMapping("{orderId}")
    public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
        // 根据id查询订单并返回
        Order order = orderService.queryOrderById(orderId);
        String url = "http://userserver/user/" + order.getUserId();
    
        User forObject = restTemplate.getForObject(url, User.class);
        order.setUser(forObject);
        return order;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    这样,访问userserver的时候Eureka会自动选择一个示例来进行访问。

    测试时,例如调用 http://localhost:8080/order/101 发现同样可以访问,这样就避免了让我们选取实例访问的问题了。

  • 相关阅读:
    基于Java+Swing+Socket实现中国象棋-网络版
    拥塞控制(计算机网络)
    【Happy!1024】C++智能指针
    如何用Python3自撰一个简单的后端框架
    【Linux】——select详解
    力扣(LeetCode)10. 正则表达式匹配(C++)
    记录锁,间隙锁,临键锁还在傻傻分不清楚?一招教你直达行级锁本质
    基于支持向量机的试剂条图像识别,基于SVM的图像识别,SVM的详细原理,Libsvm工具箱使用注意事项
    搞流式计算,大厂也没有什么神话
    Java Spring框架是什么?它有哪些好处?
  • 原文地址:https://blog.csdn.net/ifhuke/article/details/127742275