当前位置: 首页 > news >正文

SpringCloud之服务注册中心--Eureka基础与进阶实战

(一)什么是服务注册中心

服务注册中心是微服务架构中非常重要的一个组件,在微服务架构中起到了协调者的作用,一般包含下面几个功能:

  1. 服务发现:保存服务提供者和服务调用者的信息;服务调用者订阅服务提供者的信息
  2. 服务配置:服务提供者和服务调用者订阅微服务相关的配置;主动将配置推送给服务提供者和服务调用者
  3. 服务健康检查:检测服务提供者的健康情况

服务注册的过程如下图所示:

服务注册中心的框架有很多,比如zookeeper,Eureka,Consul等等,Eureka是SpringCloud中的重要组件,其只满足cap定理中的ap,cap定理指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。Eureka更看重高可用性和分区容错性。

(二)Eureka的基础使用

想了解Eureka的更深介绍可以去它的官网,在这里直接对Eureka进行实践,使用Eureka的方法主要有以下三步:

1.搭建eureka server

1.1 创建工程

我们在上一章的基础上继续编码,首先在项目中创建module命名为eureka_server

1.2 导入依赖

在eureka_server的pom.xml文件中增加下面的依赖

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

1.3 修改配置

在resources包下新建application.properties配置文件,添加eureka相关配置,并设置端口号为9000(自定义)

server.port=9000
#指定hostname
eureka.instance.hostname=localhost
#是否将自己注册到注册中心
eureka.client.register-with-eureka=false 
#是否从eureka中获取注册信息
eureka.client.fetch-registry=false
#配置暴露给Eureka client的请求地址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

1.4 配置启动类

在java包下新建EurekaApplication启动类,增加@EnableEurekaServer注解表示支持eurekaserver

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

这个时候在浏览器中输入:http://localhost:9000/即可看到eureka的详情页面:

 

2.将服务提供者注册到eurekaServer上

我们需要把服务提供者的信息都注册到eurekaserver上,让服务调用者可以调用

2.1 引入EurekaClient的相关依赖

修改user_service的pom.xml,添加eureka client依赖

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

2.2 修改配置,添加EurekaServer的信息

在配置文件中增加eureka的相关配置

#配置Eureka
eureka.client.service-url.defaultZone=http://localhost:9000/eureka/
#使用ip地址注册
eureka.instance.prefer-ip-address=true

 2.3 修改启动类,添加服务发现的支持

修改启动类,增加一个@EnableEurekaClient注解:

@SpringBootApplication
@EntityScan("com.sdxb.entity")
@EnableEurekaClient
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class,args);
    }
}

 此时运行user_service的启动类,并刷新注册中心,可以看到user_service已经被注册上去了:

 

3.服务消费者通过注册中心获取服务列表,并调用

当服务注册到注册中心后,服务调用者就可以通过eureka注册中心调用服务了

3.1 引入EurekaClient的相关依赖

修改admin_service的pom.xml,添加eureka client依赖

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

3.2 修改配置,添加EurekaServer的信息

在配置文件中增加eureka的相关配置

#配置Eureka
eureka.client.service-url.defaultZone=http://localhost:9000/eureka/
#使用ip地址注册
eureka.instance.prefer-ip-address=true

3.3 在启动类增加@EnableEurekaClient注解

3.4 调用user微服务

在前一个博客中,我们调用user微服务是通过直接填入url的方式进行调用,当有了注册中心之后,我们就可以通过注册中心进行调用。修改adminController

@RestController
@RequestMapping("/admin")
public class adminController {
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;
    @RequestMapping(value = "/{id}",method = RequestMethod.GET)
    public User getuser(@PathVariable int id){
        //修改前通过url调用微服务
        //User user= restTemplate.getForObject("http://127.0.0.1:9001/user/1",User.class);
        List<ServiceInstance> instances = discoveryClient.getInstances("user_service");
        ServiceInstance serviceInstance = instances.get(0);
        User user= restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()
                +"/user/1",User.class);
        return user;
    }
}

 

在这里通过DiscoveryClient 来调用注册中心中的微服务,首先自动注入DiscoveryClient ,通过getInstances(服务名)的方法得到服务实例,这个实例中包含有微服务的所有元数据,即请求url等数据,因为user_service只有一条数据,所以用instance.get(0)取到实例,然后修改url的写法来调用user微服务。

启动admin_service,在浏览器中访问http://localhost:9002/admin/1,得到和之前一样的数据,这就实现了服务注册中心的功能。

(三)Eureka的进阶使用

前面我们已经讲到了Eureka支持高可用性,即一个eureka注册中心宕机后仍然有其他注册中心可以使用,实现这一项功能也不难,在这里我们创建2个eureka注册中心,端口号分别为8000和9000,并且为了各个注册中心注册的服务相同,于是要实现两个注册中心的相互注册。

1.修改eureka配置文件

因为要实现注册中心的相互注册,因此我们之前写的两个false都要改为true

eureka.client.register-with-eureka=true 
#是否从eureka中获取注册信息
eureka.client.fetch-registry=true

 因为端口为9000的注册中心要注册给端口为8000的注册中心,于是修改service-url

eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:8000/eureka/

 使用run dashboard启动EurekaApplication,此时会发现正在报错,因为找不到8000的端口,直接在Run Dashboard下copy一个新的节点:

 我把它命名为EurekaApplication2,然后修改eureka的配置文件,设置端口为8000,请求地址为9000

server.port=8000
eureka.instance.hostname=localhost
#是否将自己注册到注册中心
eureka.client.register-with-eureka=true 
#是否从eureka中获取注册信息
eureka.client.fetch-registry=true
#配置暴露给Eureka client的请求地址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:9000/eureka/

启动我们copy的节点,会发现不报错了,页面效果也如上所示。浏览器中输入http://localhost:8000/和http://localhost:9000/,都成功展示eureka详情,并且互相注册成功。

2.修改两个微服务的配置文件

我们需要让每个微服务能同时注册到两个注册中心里,因为修改两个微服务的配置文件,使用逗号分隔多个注册中心:

eureka.client.service-url.defaultZone=http://localhost:9000/eureka/,http://localhost:8000/eureka/

 此时再启动user_service和admin_service时就会把服务注册到两个注册中心,即使有一个断掉,服务依旧可以正常使用。

附上github源码:github源码,与这篇博客对应的代码放在version2.0分支上

 

相关文章:

  • 老李分享:loadrunner 的86401错误
  • SpringCloud之服务远程调用--ribbon的服务调用和负载均衡
  • SpringCloud之模板化Http客户端--Feign的入门和高级使用
  • Linux 添加开机启动项的两种方法
  • SpringCloud之容错框架--Hystrix的入门和高级使用
  • IOS指纹识别调用
  • SpringCloud之微服务网关的入门与进阶(请求过滤、网关限流)
  • redis入门到精通系列(一):入门redis看这一篇就够了
  • 常用的第三方库
  • redis入门到精通系列(二):redis操作的两个实践案例
  • 给所有的td单元格绑定一个click事件
  • redis入门到精通系列(三):key的通用操作和redis内部db的通用操作
  • 正则表达式与grep详解
  • redis入门到精通系列(四):Jedis--使用java操作redis详解
  • C语言 原码--反码--补码
  • 「面试题」如何实现一个圣杯布局?
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • ECS应用管理最佳实践
  • GraphQL学习过程应该是这样的
  • Java比较器对数组,集合排序
  • Java超时控制的实现
  • MySQL数据库运维之数据恢复
  • Phpstorm怎样批量删除空行?
  • Spring Boot MyBatis配置多种数据库
  • spring boot 整合mybatis 无法输出sql的问题
  • use Google search engine
  • yii2中session跨域名的问题
  • 笨办法学C 练习34:动态数组
  • 创建一种深思熟虑的文化
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 对JS继承的一点思考
  • 多线程 start 和 run 方法到底有什么区别?
  • 高度不固定时垂直居中
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端知识点整理(待续)
  • 驱动程序原理
  • 正则表达式
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)(1.13) SiK无线电高级配置(六)
  • (2)STM32单片机上位机
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)ABI是什么
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)程序员技术练级攻略
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...