Spring Cloud-Eureka 服务注册与发现

ゝ一世哀愁。 2022-05-25 12:06 248阅读 0赞

文章目录

  • Spring Cloud-Eureka 服务注册与发现
        • 1.Eureka
          • 1.1 什么是Eureka
          • 1.2 Eureka-server
            • pom.xml
            • application.yml
            • EurekaApp.java
            • application.yml
        • 2.服务提供者 provider-user
          • pom.xml
          • application.yml
          • UserController.java
          • UserApp.java
        • 3.服务消费者
          • application.yml
          • OrderController.java

Spring Cloud-Eureka 服务注册与发现

 在前面讲到,微服务的架构涉及到服务提供者和消费者,利用RPC去建立连接,那么一个公共的注册中心是不可或缺的。在这里,我们需要用的的组件上Spring Cloud Netflix的Eureka ,eureka是一个服务注册和发现模块。
Spring Cloud官网
Spring Cloud文档
Spring Cloud中文文档

1.Eureka

1.1 什么是Eureka

 官方的介绍在这里Eureka wiki。Eureka是Netflix开源的一个RESTful服务,主要用于服务的注册发现。
 Eureka由两个组件组成:Eureka服务器和Eureka客户端。;Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
 集群方案逻辑架构图如下:
这里写图片描述
 上面的体系结构描述了Netflix如何部署Eureka,这是通常运行的方式。每个区域一个Eureka集群区域,负责该区域内的服务实例。每个区域至少有一台Eureka服务器来处理区域故障。
 服务注册Eureka,然后发送心跳每30秒更新一次租约。如果客户端无法续租几次,则会在大约90秒内将其从服务器注册表中取出。注册信息和更新被复制到群集中的所有Eureka节点。来自任何区域的客户端可以查找注册表信息(每30秒发生一次)以找到他们的服务(可能位于任何区域)并进行远程调用。
 通过了解之后,我觉得Eureka有以下几点吸引我的地方:

  1. 开源:可以了解实现原理,有必要还能修改源码。
  2. 可靠:经过Netflix多年的生产环境考验,使用应该比较靠谱省心
  3. 功能齐全:不但提供了完整的注册发现服务,还有Ribbon等配合使用的服务。
  4. 基于Java:对于Java程序员来说,使用起来更加有底。
  5. spring cloud:可以使用Spring Cloud,与Eureka进行了很好的集成,使用起来非常方便。
1.2 Eureka-server

 搭建一个eureka-server服务,可以延续上一篇博客中,构建一个子项目eureka-server

pom.xml
  1. <!--eureka server -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-eureka-server</artifactId>
  5. <version>1.4.3.RELEASE</version>
  6. </dependency>
  7. <!-- spring boot test -->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-test</artifactId>
  11. <scope>test</scope>
  12. </dependency>
  13. <!-- 安全依赖-->
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-security</artifactId>
  17. </dependency>
application.yml
  1. server:
  2. port: 10000
  3. # 由于当前eureka是单机,所以需要做一些配置
  4. eureka:
  5. instance:
  6. hostname: localhost
  7. client:
  8. register-with-eureka: false
  9. fetch-registry: false
  10. server-url:
  11. defaultZone: http://${ eureka.instance.hostname}:${ server.port}/eureka/
EurekaApp.java
  1. package com.ithzk.spring.cloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. /** * Hello world! * */
  6. @SpringBootApplication
  7. @EnableEurekaServer//将当前项目标记为eureka server
  8. public class EurekaApp
  9. {
  10. public static void main( String[] args )
  11. {
  12. SpringApplication.run(EurekaApp.class);
  13. }
  14. }

 这样就搭建好了一个eureka服务,访问http://localhost:10000/ ,此时需要输入一个用户名和密码,用户名默认user,密码在启动项目时自动生成
这里写图片描述
 进入到这个界面说明搭建成功
这里写图片描述
 修改配置文件,可以达到免密登录

application.yml
  1. server:
  2. port: 10000
  3. # 由于当前eureka是单机,所以需要做一些配置
  4. eureka:
  5. instance:
  6. hostname: localhost
  7. client:
  8. register-with-eureka: false
  9. fetch-registry: false
  10. server-url:
  11. defaultZone: http://user:user@${ eureka.instance.hostname}:${ server.port}/eureka/
  12. security:
  13. basic:
  14. enabled: true # 开启安全配置 需要密码 若不需要则设为false 注意该参数必须放在application.yml中而不能放在bootstrap.yml
  15. user:
  16. name: user
  17. password: user # 在配置用户和密码后 可以修改地址的访问风格为curl风格

2.服务提供者 provider-user

 改装之前简单样例中的项目注册eureka

pom.xml
  1. <!-- spring boot test -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-test</artifactId>
  5. <scope>test</scope>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>
  11. <!--eureka client -->
  12. <dependency>
  13. <groupId>org.springframework.cloud</groupId>
  14. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  15. <version>1.4.3.RELEASE</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-actuator</artifactId>
  20. </dependency>
application.yml
  1. server:
  2. port: 7900 #程序启动后的端口,也就是tomcat的端口,可自定义
  3. spring:
  4. application:
  5. name: provider-user
  6. eureka:
  7. client:
  8. service-url:
  9. defaultZone: http://user:user@localhost:10000/eureka/
UserController.java
  1. package com.ithzk.spring.cloud.controller;
  2. import com.ithzk.spring.cloud.entity.User;
  3. import com.netflix.appinfo.InstanceInfo;
  4. import com.netflix.discovery.EurekaClient;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8. import org.springframework.web.bind.annotation.RestController;
  9. /** * @author hzk * @date 2018/5/13 */
  10. @RestController("/")
  11. public class UserController {
  12. @Autowired
  13. private EurekaClient eurekaClient;
  14. @GetMapping("/user/{id}")
  15. public User getUser(@PathVariable Integer id){
  16. return new User(id,"zs",20);
  17. }
  18. @GetMapping("/eureka/info")
  19. public String info(){
  20. InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka("PROVIDER-USER", false);
  21. return instanceInfo.getHostName();
  22. }
  23. }
UserApp.java
  1. package com.ithzk.spring.cloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  5. /** * Hello world! * */
  6. @SpringBootApplication
  7. @EnableEurekaClient//eureka 客户端
  8. public class UserApp {
  9. public static void main(String[] args )
  10. {
  11. SpringApplication.run(UserApp.class);
  12. }
  13. }

 此时启动UserApp,在eureka服务中可以查看到服务者上线
这里写图片描述
 ps:在构建过程中遇到过一次问题导致无法启动 java.lang.NoSuchMethodError:
 java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent:这是由于JDK版本问题造成,部分方法从JDK8开始支持,所以需要将项目变为JDK8的环境
这里写图片描述

3.服务消费者

 同样改装之前简单样例消费者项目,pom.xml与以上提供者一致,App启动类同理加上@EnableEurekaClient注解

application.yml
  1. server:
  2. port: 8900
  3. spring:
  4. application:
  5. name: consumer-order
  6. user:
  7. url: http://localhost:7900/user/
  8. eureka:
  9. client:
  10. service-url:
  11. defaultZone: http://user:user@localhost:10000/eureka/
OrderController.java
  1. package com.ithzk.spring.cloud.controller;
  2. import com.ithzk.spring.cloud.entity.User;
  3. import com.netflix.appinfo.InstanceInfo;
  4. import com.netflix.discovery.EurekaClient;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.web.bind.annotation.PathVariable;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import org.springframework.web.client.RestTemplate;
  11. /** * @author hzk * @date 2018/5/13 */
  12. @RestController
  13. public class OrderController {
  14. //spring 提供用于访问rest接口的模板对象
  15. @Autowired
  16. private RestTemplate restTemplate;
  17. @Autowired
  18. private EurekaClient eurekaClient;
  19. @Value("${user.url}")
  20. private String url;
  21. @GetMapping("/order/{id}")
  22. public User getOrder(@PathVariable Integer id){
  23. //访问提供者 获取数据 通过rest访问获取的json数据转换为的User对象
  24. //PROVIDER-USER 为eureka中提供者注册服务名称
  25. InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka("PROVIDER-USER", false);
  26. //获取接口项目地址
  27. String homePageUrl = instanceInfo.getHomePageUrl();
  28. User user = restTemplate.getForObject(homePageUrl + "/user/" +id, User.class);
  29. return user;
  30. }
  31. }

 这样就简单搭建好了eureka-server、服务提供者和服务消费者,此时eureka注册中心有两个服务注册成功
这里写图片描述
 通过调用http://localhost:8900/order/xx 可以达到同样的效果、到此基本的使用就大功告成

发表评论

表情:
评论列表 (有 0 条评论,248人围观)

还没有评论,来说两句吧...

相关阅读

    相关 服务注册发现

    在分布式系统中,各个子系统都是多个实例存在,这个时候必须要引入一个服务协调器,用于给调用方提供可用的调用提供者的命名消息。 服务协调器,如zookeeper,etcd,eu