【SpringCloud 系列】Eureka 注册中心初体验

76 篇文章 2 订阅
17 篇文章 1 订阅
本文介绍了SpringCloud中的Eureka服务注册与发现组件,包括Eureka的基本概念、工作原理及其实例演示。通过创建Eureka Server和Eureka Client,展示了服务的注册和调用过程,强调了服务名在通信中的重要性,并提出了关于Eureka安全性和高可用性的思考。文章最后提供了项目的GitHub源码链接。
摘要由CSDN通过智能技术生成

【SpringCloud 系列】Eureka 注册中心初体验

在 SpringCloud 微服务体系中,有几个比较重要的组件,如注册中心,配置中心,网关,安全、负载均衡、监控等等,接下来我们将来看一下这些常用的组件有什么用,在微服务架构下的该怎么用。

本文为为第一篇,注册中心 Eureka 的使用说明

I. 基本介绍

1. 注册中心

注册中心,主要的核心点是服务的注册与发现。

简单来讲,就是我们的所有服务都会在注册中心上标识自己,注册中心统一管理所有的服务名与具体的应用之间的映射关系,这样微服务之间的访问,就可以直接通过服务名来相互通信,相比较于直接通过 ip 端口的访问,这样的好处是当某个服务下线、新增或者换了机器,对调用者而言,只要维持一份注册中心的最新映射表即可,不需要其他任何改动逻辑。

我们通常可用的注册中心有 EurekaConsulZookeepernacos等,在我们后续的教程中会逐一进行介绍

Eureka2.x 闭源,1.x 虽然可用,但新项目的话不建议再使用它,比如Consulnacos 都是不错的选择

如果出于学习的目的,或者由于历史原因(比如我),学习了解一下 Eureka 知识点也没什么坏处

2. Eureka

Eureka 是 Netflix 开源的服务发现组件,本身是一个基于 REST 的服务,通常包含 Server 和 Client 端

原理如下图

来源于网络

  • server: 提供服务注册,并在服务注册表中存储所有可用服务节点的信息

  • client: 简化与 Server 之间的交互,比如封装了发送心跳,获取注册信息表等基本操作

II. 实例演示

1. 版本说明

后续的演示项目中,我们的环境与版本信息如下

  • 开发环境: IDEA + maven

  • SpringBoot: 2.2.1.RELEASE

  • SpringCloud: Hoxton.M2

2. Eureka Server 端

Eureka 区分了 Server 和 Client 两端,即我们有一个独立的注册中心服务,其他的微服务则作为 Client 端

Server 端核心依赖如下

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


<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

然后在配置文件中,添加一些基本信息

server:
  port: 8081 #服务注册中心端口号
eureka:
  instance:
    hostname: 127.0.0.1 #服务注册中心IP地址
  client:
    registerWithEureka: false #是否向服务注册中心注册自己
    fetchRegistry: false #是否检索服务
    serviceUrl: #服务注册中心的配置内容,指定服务注册中心的位置
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

请注意,上面的registerWithEureka这个配置,设置为 false,不像自己注册服务(后续会介绍多个 Eureka 实例时,可以如何配置)

然后再启动类上,添加注解@EnableEurekaServer来申明 Eureka 服务

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

到此,一个 Eureka 服务端已经完成,此时我们可以直接访问http://localhost:8081,会看到一个自带的控制台,会提供一些基本信息

3. Eureka 客户端

我们这里设计两个客户端,一个提供服务,另外一个调用,演示一下 Eureka 的基本功能

a. 客户端 eureka-service-provider

客户端需要在 pom 文件中,添加下面的关键依赖

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

接下来需要在配置文件中,指定注册中心的地址,以及服务名(请注意,这个服务名是重要线索,后面会用到!!!)

server:
  port: 8082 #服务端口号
eureka:
  client:
    serviceUrl: #注册中心的注册地址
      defaultZone: http://127.0.0.1:8081/eureka/
spring:
  application:
    name: eureka-service-provider #服务名称--调用的时候根据名称来调用该服务的方法

同样的需要在启动类上,通过@EnableEurekaClient来标注客户端

@EnableEurekaClient
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

我们在这个项目中,写一个基本 REST 接口,供后面的服务进行调用

@RestController
@RequestMapping(path = "userService")
public class UserService {
    @Override
    @RequestMapping(path = "/getUserById")
    public UserDTO getUserById(@RequestParam long userId) {
        UserDTO userDTO = new UserDTO();
        userDTO.setUserId(userId);
        userDTO.setNickname("一灰灰blog");
        userDTO.setUserName("yihuihuiblog");
        userDTO.setPhone(88888888L);
        return userDTO;
    }
}

再看一下上面的实现,你会发现和平时写的 Controller 没有任何的区别

到这里第一个 Eureka 客户端已经完成,并提供了一个 REST 接口,接下来我们开始写第二个 Eureka 客户端,用来访问上面的 REST 服务

b. 客户端 eureka-service-consumer

基本的流程和上面没有任何区别,只是将配置文件稍微改一下

server:
  port: 8083  #服务端口号
eureka:
  client:
    serviceUrl: #注册中心的注册地址
      defaultZone: http://127.0.0.1:8081/eureka/
spring:
  application:
    name: eureka-service-consumer #服务名称--调用的时候根据名称来调用该服务的方法

那么在这个服务中,如何访问 eureka-service-provider 提供的服务呢?

  • 通过RestTemplate来实现

请注意,这个 RestTemplate 和我们普通的new RestTemplate()创建的不一样哦,我们是通过如下方式获取实例

@Bean
@LoadBalanced
public RestTemplate rest() {
    return new RestTemplate();
}

重点关注方法上的@LoadBalanced注解,这个会在后续的 Ribbon 的章节中深入介绍,在这里只需要知道通过它生成的RestTemplate,在发起访问时,会借助 Eureka 的注册信息表,将服务名翻译为对应的ip+端口号

接下来就是我们的访问环节,写法如下

@Autowired
private RestTemplate restTemplate;

@GetMapping(path = "uid")
public String getUser(int userId) {
    UserDTO dto = restTemplate
            .getForObject("http://eureka-service-provider/userService/getUserById?userId=" + userId, UserDTO.class);

    return userId + "'s info: " + dto;
}

请着重看一下访问的 url: "http://eureka-service-provider/userService/getUserById?userId=" + userId,这里没有域名,没有 ip,是直接通过服务名进行访问的

4. 测试与小结

我们依次将上面的 Server 和两个 Client 启动,然后访问http://localhost:8081,查看 Eureka 控制台,可以看到如下界面,两个客户端都已经注册好了

然后再测试一下通过 consumer 访问 provider 的服务

到此 Eureka 的核心功能已经演示完毕,当然如果仅仅只是这样,这个学习成本好像很低了,作为一个有思考的小青年,看了上面的流程自然会有几个疑问

  • 安全问题

    • 注册中心控制台直接访问,这要是暴露出去了...

    • 一个 Eureka 实例,单点故障怎么解

  • 服务注册多久生效?服务下线多久会从注册信息表中摘除?服务存活判断是怎样的?

  • 通过RestTemplate方式使用,很不优雅啊,有没有类似 rmi 的通过类调用的方式呢?

II. 其他

0. 项目

  • 工程:https://github.com/liuyueyi/spring-boot-demo

  • 源码:- https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-cloud/eurka-server - https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-cloud/eurka-service-consumer - https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-cloud/eurka-service-provider

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hanchufeng2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值