红茶的个人站点

  • 首页
  • 专栏
  • 开发工具
  • 其它
  • 隐私政策
Awalon
Talk is cheap,show me the code.
  1. 首页
  2. Spring Cloud 学习笔记
  3. 正文

从零开始 Spring Cloud 2:Eureka 注册中心

2023年7月14日 890点热度 0人点赞 0条评论

image-20230714102655393

图源:laiketui.com

Eureka 常被用作 Spring Cloud 的注册中心,用于注册微服务的接口提供方。

在上一篇文章中,我们实现了两个子模块互相调用接口,但存在一个缺陷,接口的主机名是硬编码的。这样很难维护,且没法做集群。这个问题正好可以用 Eureka 解决。

本文将学习如何在项目中添加 Eureka 注册中心,以及将接口注册到 Eureka。

本文的示例项目基于上一篇文章构建的项目。

添加 Eureka 服务端

按照上一篇文章介绍过的方式,添加一个 Maven 子模块 eureka-server:

image-20230714143404355

依赖

在子模块 eureka-server 中添加 eureka 服务端的依赖:

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

启动类

添加一个根包 org.example.shopping.eureka,并添加启动类:

package org.example.shopping.eureka;
// ...
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

不要忘记添加@EnableEurekaServer,否则 Eureka 不能正常启动,会报错。

配置文件

添加配置文件 application.yml :

server:
  port: 8090
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8090/eureka

这里的配置项 eureka.client.service-url.defaultZone 用于将当前应用注册到指定的 eureka,在eureka-server 这个子模块中,意味着将自己注册到自己。这样设计是有意义的,eureka 本身也可以做集群,如果那样,可以通过这种方式将 eureka 注册到所在的集群服务器。

控制面板

现在访问 http://localhost:8090/ 就能看到 Eureka 的控制面板:

image-20230714152335990

其中的 Instances currently registered with Eureka 显示的是当前注册到 Eureka 上的微服务实例。之所以说是“实例”,是因为同一个微服务应用可以部署多个实例,作为集群使用,此时接口调用时就可以用负载均衡的方式选取其中一个调用。

注册服务

下面将子模块 shopping-user 注册到 Eureka,这样子模块 shopping-order 就可以通过 Eureka 获取接口地址并调用接口,不用再将接口硬编码了。

依赖

在在模块 shopping-user 的 POM 中添加 Eureka 客户端的依赖:

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

如果 Maven 不能正常下载依赖,可以选取一个指定版本的依赖,我这里使用了3.1.3(服务端也使用了这个版本):

image-20230714161107212

配置文件

修改配置文件,添加应用名和 Eureka 服务端地址:

spring:
  application:
    name: shopping-user
    eureka:
client:
  service-url:
    defaultZone: http://localhost:8090/eureka

测试

现在启动子模块 shopping-user 和 eureka-server,打开 eureka 的控制面板:

image-20230714161550859

可以看到两个注册的服务,Status 列也可以看到服务地址。

启动多个实例

在 Service 面板中右键 Copy Configuration:

image-20230714162044570

如果没有 Service 窗口,可以通过菜单 view->tool windows->services 开启。

为另一个运行实例起一个名字,并添加启动参数 -Dserver.port=8082:

image-20230714162331631

现在 Not Started 菜单下会出现刚添加的启动配置。

image-20230714162536736

右键 run 启动。

现在在 Eureka 的控制面板就能看到启动了两个 shopping-user 实例。

image-20230714162742284

使用服务

依赖

子模块 shopping-order 要使用 Eureka 获取服务地址,同样需要添加 Eureka 客户端依赖:

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

配置文件

修改配置文件,添加 Eureka 服务地址:

spring:
  application:
    name: shopping-order
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8090/eureka

负载均衡

启用负载均衡,这里只需要为RestTemplate的 bean 方法添加@LoadBalanced注解:

@Configuration
public class WebConfig {
    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

服务调用

修改OrderService,将硬编码的接口地址修改为使用 Eureka 上注册的服务名:

@Service
public class OrderService {
    // ...
    public Order findOrderById(Long orderId) {
        Order order = orderMapper.findById(orderId);
        String url = String.format("http://shopping-user/user/%d", order.getUserId());
        Result<?> result = restTemplate.getForObject(url, Result.class);
        // ...
    }
}

现在再尝试访问接口 http://localhost:8080/order/101,可以通过 IDEA 的 services 窗口查看到 shopping-user 的其中一个实例响应了接口调用。

The End,谢谢阅读。

本文的完整示例代码可以从这里获取。

参考资料

  • IDEA开启并配置services窗口

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: eureka spring cloud
最后更新:2023年8月30日

魔芋红茶

加一点PHP,加一点Go,加一点Python......

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2021 icexmoon.cn. ALL RIGHTS RESERVED.
本网站由提供CDN加速/云存储服务

Theme Kratos Made By Seaton Jiang

宁ICP备2021001508号

宁公网安备64040202000141号