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

阅读全文 »

two-sum

题目描述

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

示例1:

输入: 123
输出: 321

示例2:

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

输入: 120
输出: 21

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

阅读全文 »

two-sum

题目描述

给定一个整数数组 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

概述

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

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

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

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

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

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

spring-schema

概述

从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容器中
  • 验证结果
阅读全文 »