Ok Boom

” 勿忘初心,方得始终 “

什么是服务注册

服务注册是一种目录服务,有利于服务的定义,服务的选择和在执行服务政策

通俗点讲,比如我们 (服务) 去餐厅 (注册中心) 吃饭,每个餐桌都有一个编号 (服务注册属性) 对应我们 (服务),这样服务员就可以通过编号找到我们,再进行点餐、结账操

Spring Cloud 怎么实现服务注册

在构建 Spring Cloud 微服务项目的时候,我们通常会在服务启动类加上 @SpringCloudApplication 注解并在配置文件中写上 spring.cloud.discovery 指定服务注册地址来实现服务注册,这服务注册看似很简单嘛(🙂)。那 Spring Cloud 做了哪些让我们服务注册很简单呢?带着这个疑问我们来一步步揪出罪魁祸首。

首先看 SpringCloudApplication 注解,在这类中有一个 @EnableDiscoveryClient (开启服务发现客户端) 注解

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @author Spencer Gibb
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {

}

那为啥引用 @EnableDiscoveryClient 注解就可以实现服务发现呢,我们再来看看 EnableDiscoveryClient 类中做了些什么

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* Annotation to enable a DiscoveryClient implementation.
* @author Spencer Gibb
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(EnableDiscoveryClientImportSelector.class)
public @interface EnableDiscoveryClient {

/**
* If true, the ServiceRegistry will automatically register the local server.
* 如果是真的,那么这个服务注册将自动注册到本地服务
* @return - {@code true} if you want to automatically register.
*/
boolean autoRegister() default true;

}

从 EnableDiscoveryClient 类中我们可以看到定义了 autoRegister 方法,默认返回 true,并且它还引用了 EnableDiscoveryClientImportSelector 类,那这个类做了什么值得 EnableDiscoveryClient 去引用呢

阅读全文 »

题目描述

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true

示例 2:

输入: -121
输出: false
解释:从左向右读,为 -121 。 从右向左读,为 121- 。因此它不是一个回文数。

示例 3:

输入: 10
输出: false
解释:从右向左读,为 01 。因此它不是一个回文数。

进阶:

你能不将整数转为字符串来解决这个问题吗?

阅读全文 »

概念

spi 全称(Service Provider Interface),是 JDK 内置的一种服务发现机制,不同的厂商可以通过扩展的形式来动态替换需要实现的方法

约定

  • 在 META-INF/services/ 目录中创建以 Service 接口路径命名的文本文件,文件中包含实现接口实现类的路径,多个实现类以换行符分割
  • 使用 ServiceLoader.load 动态加载 Service 接口的实现类
  • 如 SPI 的实现类为 jar,则需要将其放在当前程序的 classpath 下

应用

在实际开发过程中我们可能会用到 apacheHttp 和 okHttp 的一些框架,我们可以让用户自主选择用一个他们比较熟悉的 http 框架
我们首先来创建一个 spi 项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
.
├── pom.xml
├── spi.iml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │   └── tookbra
│   │   │   └── spi
│   │   │   ├── ApacheHttpProxy.java
│   │   │   ├── HttpProxy.java
│   │   │   ├── Main.java
│   │   │   └── OkHttpProxy.java
│   │   └── resources
│   │   └── META-INF
│   │   └── services
│   │   └── com.tookbra.spi.HttpProxy
│   └── test
│   └── java
└── target
├── classes
│   ├── META-INF
│   │   └── services
│   │   └── com.tookbra.spi.HttpProxy
│   └── com
│   └── tookbra
│   └── spi
│   ├── ApacheHttpProxy.class
│   ├── HttpProxy.class
│   ├── Main.class
│   └── OkHttpProxy.class
└── generated-sources
└── annotations

1. 创建接口 com.tookbra.spi.HttpProxy

1
2
3
4
5
6
7
8
9
10
11
package com.tookbra.spi;

/**
* @author tookbra
* @date 2019/1/9
* @description
*/
public interface HttpProxy {

void proxy();
}

2. 创建对应的实现类
com.tookbra.spi.ApacheHttpProxy

阅读全文 »

题目描述

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21

注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [231,2311]。请根据这个假设,如果反转后整数溢出那么就返回 0。

阅读全文 »

题目描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums [0] + nums [1] = 2 + 7 = 9
所以返回 [0, 1]

阅读全文 »

前言

这份文档是 Google Java 编程风格规范的完整定义。当且仅当一个 Java 源文件符合此文档中的规则,我们才认为它符合 GoogleJava 编程风格。

与其它的编程风格指南一样,这里所讨论的不仅仅是编码格式美不美观的问题,同时也讨论一些约定及编码标准。然而,这份文档主要侧重于我们所普遍遵循的规则,对于那些不是明确强制要求的,我们尽量避免提供意见。

术语说明

本文档中除非特殊说明,否则:

  • 术语 class 可表示一个普通类、枚举类、接口或者注解。
  • 术语 comment 只用来指代实现的注释 (implementation comments),我们不使用文档注释 (documentation comments) 一词,而是用 Javadoc

其他术语说明,将在文档中需要说明的地方单独说明。

指南说明

本文档中的示例代码并不作为规范。也就是说,虽然示例代码是遵循 Google 编程风格,但并不意味着这是展现这些代码的唯一方式。示例中的格式选择不应该被强制定为规则。

源文件基础

阅读全文 »

概述

上文 我们描述了怎么去实现 spring schema 扩展,本文我们来介绍通过另外一种方式也来实现上文中实现的功能。

在以前开发的时候我们通常通过配置 xml 来告诉 spring 容器在应用程序中如何去实例化,配置和组装应用程序中的对象,但是 xml 配置不是唯一配置元数据的方式。

  • 基于注释的配置 从 Spring 2.5 开始引入了对基于注释的配置元数据的支持
  • 基于 Java 的配置 从 Spring3.0 开始,提供了基于 Java 的配置方式,我们可以使用 java 类来定义配置属性

在 Spring boot 中默认是使用 java 配置的方式。

我们按照以下步骤来扩展 java 配置

  • 自定义注解
  • 实现 ImportBeanDefinitionRegistrar
  • 实现 BeanFactoryPostProcessor
  • 验证结果
阅读全文 »

概述

从 spring 2.0 以后,spring 提供了 schema 扩展,当 spring 的 xml 配置满足不了我们的时候,我们可以使用 spring schema expand 来自定义 xml 解析器

像我们熟知的 spring-context,spring-bean,spring-tx,dubbo 等框架都使用了 spring schema expand

我们通过以下步骤来创建一个 spring schema expand

  • 创建 xml 描述
  • 编写 xsd 文件,描述自定义对象
  • 实现自定义 NamespaceHandlerSupport
  • 实现自定义 BeanDefinitionParser
  • 注册解析器到 spring 容器中
  • 验证结果
阅读全文 »