微服务3 Eureka注册中心

Source

目录

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

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

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

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
}

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.在各模块引入依赖

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

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 注解,用于开启负载均衡

@Configuration
public class OrderConfiguration {
    /**
     * 创建RestTemplate并注入spring容器
     * @return
     */
    @Bean
    @LoadBalanced //开启负载均衡
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

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

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