3.Eureka注册中心

Eureka注册中心

1.问题分析

假如我们的服务提供者user-service部署了多个实例,如图:

  • order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?
  • 有多个user-service实例地址,order-service调用时该如何选择?
  • order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

2.Eureka的结构和作用

这些问题都需要利用SpringCloud中的注册中心来解决,其中最广为人知的注册中心就是Eureka,其结构如下:

获取地址信息的流程如下:

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

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

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

3.搭建eureka-server

首先搭建注册中心服务端:eureka-server,这必须是一个独立的微服务

3.1引入eureka依赖

引入SpringCloud为eureka提供的starter依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>

3.2编写启动类

给eureka-server服务编写一个启动类,一定要添加一个@EnableEurekaServer注解,开启eureka的注册中心功能:

package cn.itcast.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

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

3.3编写配置文件application.yml

server:
  port: 10086 # 服务端口
spring:
  application:
    name: eurekaserver # eureka的服务名称
eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

3.4启动服务

4.服务注册

将user-service和order-service注册到eureka-server中去。

4.1引入依赖

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

4.2 加配置、application

spring: application: name: userservice eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka

4.3演示一个服务启动多个示例

5.服务发现

服务发现、服务注册统一都封装在eureka-client依赖,因此这一步与服务注册时一致。
服务发现也需要知道eureka地址,因此第二步与服务注册一致,都是配置eureka信息:

服务拉取和负载均衡

1.
String url = "http://userservice/user/" + order.getUserId();
2.

 /**
     * 创建RestTemplate并注入Spring容器
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
posted @ 2022-11-09 23:50  给我手牵你走  阅读(28)  评论(0编辑  收藏  举报