• 微服务3 Eureka注册中心


    目录

    1.服务调用出现的问题

     2.Eureka注册中心原理

    3.Eureka的作用

    4.Eureka注册中心实现

     4.1搭建注册中心

    4.2服务注册 

    4.3服务拉取(发现)


     

    1.服务调用出现的问题

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

     2.Eureka注册中心原理

     

    order-service 如何得知 user-service 实例地址?

    • user-service 服务实例启动后,将自己的信息注册到 eureka-server(Eureka服务端),叫做服务注册
    • eureka-server 保存服务名称到服务实例地址列表的映射关系
    • order-service 根据服务名称,拉取实例地址列表,这个叫服务发现或服务拉取

    order-service 如何从多个 user-service 实例中选择具体的实例?

            order-service从实例列表中利用负载均衡算法选中一个实例地址,向该实例地址发起远程调用

    order-service 如何得知某个 user-service 实例是否依然健康,是不是已经宕机?

    • user-service 会每隔一段时间(默认30秒)向 eureka-server 发起请求,报告自己状态,称为心跳
    • 当超过一定时间没有发送心跳时,eureka-server 会认为微服务实例故障,将该实例从服务列表中剔除
    • order-service 拉取服务时,就能将故障实例排除了

    3.Eureka的作用

    总结:

     

    4.Eureka注册中心实现

     4.1搭建注册中心

    1.接第二章远程调用案例cloud_demo,创建maven子模块eureka-server,引入starter

    
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
        
    

     2.编写启动类,添加@EnableEurekaServer注解,开启 eureka 的注册中心功能

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

    3.添加application.yml文件,编写下面的配置

    server:
      port: 10086 # 服务端口
    
    spring:
      application:
        name: eureka-server # 服务名称
    eureka:
      client:
        service-url: # 地址信息
          #eureka自己也是一个微服务,启动时需要将自己也注册到注册中心
          defaultZone: http://127.0.0.1:10086/eureka
    

             其中 defaultZone 是因为eureka 本身也是一个微服务,这里也要将自己注册进来,当后面 eureka 集群时,这里就可以填写多个,使用 “,” 隔开。

    4.从启动类启动,访问http://localhost:10086/

    启动报错:NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata

    解决:这是因为springboot和springcloud的版本不匹配,按照官网Spring Cloud说明使用匹配版本如:springboot2.7.x和springcloud2021.0.x

    4.2服务注册 

    将 user-service、order-service 都注册到 eureka 

     1.在各模块引入依赖

    
    
        org.springframework.cloud
        spring-cloud-starter-netflix-eureka-client
    

    2.修改配置文件

    在配置文件添加以下内容

    spring:
      application:
        #name: eureka-server # 服务名称
        #name: order-server # 服务名称
        name: user-server # 服务名称
    eureka:
      client:
        service-url: # 地址信息
          #注册到注册中心
          defaultZone: http://127.0.0.1:10086/eureka
    

    3.启动类启动

            在注册中心可看到多个服务。

    小技巧:通过 idea 的多实例启动,可以查看 Eureka 的集群效果。 为了避免端口冲突,需要修改端口设置

     点击ok后在services可看到刚添加的实例

    启动后,在eureka注册中心可看到

     

    4.3服务拉取(发现)

    在 order-service 中完成服务拉取,然后通过负载均衡挑选一个服务,实现远程调用

    1.修改OrderService的代码,修改访问的url路径,用需要访问的服务的相应配置文件的服务名称代替ip、端口:

    原:

    String url = "http://localhost:8081/user/"+order.getUserId();

     修改为:

    String url = "http://user-server/user/"+order.getUserId();
    

    2.在配置类给 RestTemplate 这个 Bean 添加一个 @LoadBalanced 注解,用于开启负载均衡

    1. @Configuration
    2. public class OrderConfiguration {
    3. /**
    4. * 创建RestTemplate并注入spring容器
    5. * @return
    6. */
    7. @Bean
    8. @LoadBalanced //开启负载均衡
    9. public RestTemplate restTemplate(){
    10. return new RestTemplate();
    11. }
    12. }

    3.重新启动order-server,
    依次访问http://localhost:8080/order/101http://localhost:8080/order/102

     可以看到,eureka自动实现负载均衡

  • 相关阅读:
    【SIMULINK】全网最牛逼boost-APFC仿真,模拟UC3854状态方程,非PI
    想了解Python中的super 函数么
    MySQL binlog归档日志和redo log事务日志详解
    vue computed计算属性
    webpack5 使用Thead多进程打包提升打包构建速度
    基于python-CNN的常见鱼类分类识别-含数据集+pyqt界面
    【Rust日报】2022-08-06 Fang, Rust的一个异步后台处理
    C++基础语法
    分享一下微信公众号怎么实现积分商城功能
    Hybrid Astar 算法剖析和实现(七)
  • 原文地址:https://blog.csdn.net/m0_62520968/article/details/127134035