springboot 注册服务注册中心(zk)的两种方式详解

在使用springboot进行开发的过程中,我们经常需要处理这样的场景:在服务启动的时候,需要向服务注册中心(例如zk)注册服务状态,以便当服务状态改变的时候,可以故障摘除和负载均衡。

我遇到过两种注册的途径:

1、在Spring的webapplication启动完成后,直接进行注册;

2、在servlet容器启动完成后,通过listener进行注册。

本文通过一个demo讲述一下这两种注册方式,使用的是传统的向zk注册的方案。

1、Spring webapplication启动完成后注册

先上代码看一下

@SpringBootApplication
public class WebApplication {
 private static final Logger logger = LoggerFactory.getLogger(WebApplication.class);
 private static volatile boolean IS_REGISTRY = false;
 public static void main(String[] args) {
 ApplicationContext context = run(WebApplication.class, args);
 if (IS_REGISTRY) {
  logger.info("注册2: WebApplication启动完成后");
  ZkClient zkClient = context.getBean(ZkClient.class);
  zkClient.register();
  IS_REGISTRY = true;
  logger.info("注册2: 注册成功");
 }
 }
}

这里,我们在WebApplication中,获取zkClient,并进行注册。

这里需要说明一点,我们这里通过ApplicationContext来获取zkClient的bean,原因是在webApplication的初始化过程中你不能用Autowired的方式注入Bean,因为在webApplication启动过程中才会读所有的configuration并将bean初始化完成,在没有完成初始化之前,你不能注入bean。

关于注册的详细代码这里不展开了。

2、在servlet容器初始化完成后,通过listener的方式进行注册

照样先上代码

@WebListener
public class RegisterListener implements ServletContextListener {
 protected final Logger logger = LoggerFactory.getLogger(this.getClass());
 private static volatile boolean IS_REGISTRY = false;
 @Autowired
 private ZkClient zkClient;
 @Override
 public void contextInitialized(ServletContextEvent servletContextEvent) {
 try {
  if (!IS_REGISTRY) {
  logger.info("注册1: Servelet容器启动成功后");
  zkClient.register();
  logger.info("注册1: 注册成功");
  }
  IS_REGISTRY = true;
 } catch (Exception e) {
  IS_REGISTRY = false;
  logger.info("注册1: 注册失败");
 }
 }
 @Override
 public void contextDestroyed(ServletContextEvent servletContextEvent) {
 if (IS_REGISTRY) {
  zkClient.stop();
 }
 }
}

你需要先写一个listener,这个listener实现ServletContextListener接口,并且用@WebListener进行注解,这是springboot注解式的listener书写方式。

在servlet容器启动成功之后,会调用这个监听器的contextInitialized方法,servlet容器如果一旦销毁,不能提供服务了,会调用监听器的contextDestroyed方法。换句话说,这个监听器在监听servlet容器的状态。

然后你只需要在application主类中打开listener配置就好。

@ServletComponentScan
@SpringBootApplication
public class WebApplication {
}

3、这两种方式的比较

对于一个对外提供http协议的web服务,在语义上servlet容器的注册会显得清晰一些,但是如果你的spring容器启动时间过长的话,可能出现servlet初始化完成,并且已经注册,但是服务不能对外提供访问的gap time,所以我一般还是使用第一种方式进行注册。

这种场景是这样的

可以看到,当servlet注册成功之后,其实webapplication还没有启动完成,这个时候服务是不能正常提供访问的。

在zk上可以看到,两次注册都已经成功了。

总结

以上所述是小编给大家介绍的springboot 注册服务注册中心(zk)的两种方式详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • 详解Spring Boot 使用Java代码创建Bean并注册到Spring中
  • Spring Boot实现邮件注册功能示例代码
  • SpringBoot的服务注册与发现示例
  • Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
(0)

相关推荐

  • 详解Spring Boot 使用Java代码创建Bean并注册到Spring中

    从 Spring3.0 开始,增加了一种新的途经来配置Bean Definition,这就是通过 Java Code 配置 Bean Definition. 与Xml和Annotation两种配置方式不同点在于: 前两种Xml和Annotation的配置方式为预定义方式,即开发人员通过 XML 文件或者 Annotation 预定义配置 bean 的各种属性后,启动 spring 容器,Spring 容器会首先解析这些配置属性,生成对应都?Bean Definition,装入到 DefaultL

  • SpringBoot的服务注册与发现示例

    微服务 实践"微服务"自然要学习如何做服务注册与发现 基于SpringBoot来进行微服务的学习,自然选择了与之息息相关的SpringCloud;当然可以选择其他的技术进行,比如dubbo 也可以用zookeeper来实现服务注册与发现,至于zookeeper来实现此功能好还是不好,各家之言都有 SpringCloud Spring Cloud provides tools for developers to quickly build some of the common patte

  • Spring shiro + bootstrap + jquery.validate 实现登录、注册功能

    之前的文章中我们已经搭建好框架,并且设计好了,数据库. 现在我们开始实现登录功能,这个可以说是Web应用最最最普遍的功能了. 先来说说我们登录的逻辑: 输入用户名.密码(validate进行前端验证)--ajax调用后台action方法--根据用户名调用业务层到数据层查询数据库信息--查询的密码跟用户输入的密码比对--shiro登录身份验证--将用户信息存入session--响应前端--前端跳转 这个是我要告诉大家的姿势,还有很多很多的姿势.下面我们来看具体的代码. 首先前端验证,这里使用了jq

  • Spring Boot实现邮件注册功能示例代码

    注册流程 1.[前端] 用户在注册页面提交注册信息: 2.[后端] 校验用户提交的参数,有误直接返回错误信息,无误向下执行: 3.[后端] 随机生成一个ID,将ID作为key,用户信息作为value,存入redis,设置时长: 4.[后端] 生成激活链接,通过邮件系统发送邮件到用户邮箱 5.[前端] 用户点击上图的"确认注册": 6.[后端] 校验value是否过期,校验邮箱是否已经注册,没有则保存用户信息到数据库,提示用户已经注册成功: 功能实现(逆向分析) 1.先看看邮件发送的实现

  • springboot 注册服务注册中心(zk)的两种方式详解

    在使用springboot进行开发的过程中,我们经常需要处理这样的场景:在服务启动的时候,需要向服务注册中心(例如zk)注册服务状态,以便当服务状态改变的时候,可以故障摘除和负载均衡. 我遇到过两种注册的途径: 1.在Spring的webapplication启动完成后,直接进行注册: 2.在servlet容器启动完成后,通过listener进行注册. 本文通过一个demo讲述一下这两种注册方式,使用的是传统的向zk注册的方案. 1.Spring webapplication启动完成后注册 先上

  • Spring框架实现AOP的两种方式详解

    目录 第一种AOP实现方式 AfterLog Log 配置文件 实例调用 定义接口 第二种AOP实现方式 第一种AOP实现方式 AfterLog package com.xxx.demo.service1; import org.junit.After; import org.springframework.aop.AfterReturningAdvice; import java.lang.reflect.Method; public class AfterLog implements Aft

  • Android事件处理的两种方式详解

    安卓提供了两种方式的事件处理:基于回调的事件处理和基于监听的事件处理. 基于监听的事件处理 基于监听的事件处理一般包含三个要素,分别是: Event Source(事件源):事件发生的场所,通常是各个组件 Event(事件):事件封装了界面组件上发生的特定事件(通常就是用户的一次操作) Event Listener(事件监听器):负责监听事件源发生的事件,并对各种事件作出相应的响应 下面使用一个简单的案例介绍按钮事件监听器 布局文件就是简单的线性布局器,上面是一个EditText,下面是一个Bu

  • Node.js中参数传递的两种方式详解

    目录 参数传递方式 GET方式 POST方式 动态网页 参数传递方式 在Node.js中,参数传递常见的共两种方式: GET方式:通过地址栏键=值的方式进行传递. POST方式:通过表单的方式传递请求数据. GET方式 GET方式通常是在请求地址中以[?参数1=值1&参数2=值2]的格式进行传递,在Node.js中可以通过获取url然后进行获取参数,如下所示: //1.引入http模块 var http = require('http'); //2.创建服务 var server = http.

  • IOS 指纹识别两种方式详解及实例

    IOS 指纹识别两种方式详解及实例 首先引入类名: #import <LocalAuthentication/LocalAuthentication.h> 然后在实现指纹识别的地方放入如下代码: 方式一: LAContext *lacontext = [[LAContext alloc]init]; // 判断设备是否支持指纹识别 BOOL isSupport = [lacontext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWit

  • 对Python使用mfcc的两种方式详解

    1.Librosa import librosa filepath = "/Users/birenjianmo/Desktop/learn/librosa/mp3/in.wav" y,sr = librosa.load(filepath) mfcc = librosa.feature.mfcc( y,sr,n_mfcc=13 ) 返回结构为(13,None)的np.Array,None表示任意数量 2.python_speech_features from python_speech_

  • mapper接口注入两种方式详解

    这篇文章主要介绍了mapper接口注入两种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.使用模板方式: <!--使用模板类实现mybatis --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFacto

  • RabbitMQ 实现延迟队列的两种方式详解

    目录 1. 用插件 1.1 安装插件 1.2 消息收发 2. DLX 实现延迟队列 2.1 延迟队列实现思路 2.2 案例 3. 小结 定时任务各种各样,常见的定时任务例如日志备份,我们可能在每天凌晨 3 点去备份,这种固定时间的定时任务我们一般采用 cron 表达式就能轻松的实现,还有一些比较特殊的定时任务,向大家看电影中的定时炸弹,3分钟后爆炸,这种定时任务就不太好用 cron 去描述,因为开始时间不确定,我们开发中有的时候也会遇到类似的需求,例如: 在电商项目中,当我们下单之后,一般需要

  • IDEA安装阿里巴巴编码规范插件的两种方式详解(在线安装和离线安装)

    目录 1.在线安装: 2.离线安装: IDEA安装阿里巴巴编码规范插件的两种方式:在线安装和离线安装. 1.在线安装: 打开file-settings-Plugins.如图: 搜索到点击右边的install按钮,即可在线安装. 在线安装非常简单. 2.离线安装: 下载插件地址:https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines/versions或者 链接: https://pan.baidu.com/

  • Spring Bean属性注入的两种方式详解

    目录 属性注入概念 一.构造器注入 示例1 注意点 二.setter注入 示例2 三.如何选择注入方式 属性注入概念 Spring 属性注入(DI依赖注入)有两种方式:setter注入,构造器注入. 这个注入的属性可以是普通属性(基本数据类型与String等),也可以是一个引用数据类型(主要是对象),或者是一个集合(list.map.set等) 下表是属性注入bean标签中常用的元素 元素名称 描述 constructor-arg 构造器注入.该元素的 index 属性指定构造参数的索引(从 0

随机推荐