现在微服务化是大趋势,因为现在伴随着移动互联网的快速发展,快速上线,快速更新等需求越来越多,所以云平台营运而来,从Docker在到Kubernate,微服务逐渐成为了现代软件开发的新宠。说道微服务,我们就要说一下,微服务需要哪些服务来支撑,为什么选择SpringBoot,微服务化因为服务粒度足够小,所以需要将多个服务进行组合来完成具体的一个业务,但是也伴随着问题而来,服务间的调用依赖,如果服务不可用就会出现问题,如果网络带宽不足,性能也会大打折扣,同时当多个服务依次调用的时候,整个链路异常定位同样很难,现在异步操作随处可见,好不容易业务跑通了,发现配置变更,不可能运行中的所有服务器都更改一下在重启吧,统一的配置管理迫在眉睫,最后关键的服务注册与发现不得不上,你不可能新增一个服务就维护一个IP和端口和URI吧。所以通过刚才的简述,学习过微服务的同学可能就已经能明白微服务需要哪些东西了,需要的东西很多,SpringBoot和SpringCloud提供了一站式解决方案,所以很多东西不需要自己再去实现就可以直接使用,因为微服务的逐步上线及业务拆分是需要一个长期的过程的,毕竟一个优质可靠的框架不是靠一次设计就可以完善的,也不是说SpingCloud就一定是最好的,通过入门,我们之后再使用过程中可以积累经验,再创造适合自己的微服务框架也未尝不可,好了今天就先说说微服务具体都有啥吧。微服务几个核心的部件分别是服务注册与发现,分布式配置管理,消息总线,熔断及降级,服务间调用Feign,性能监控,服务网关等。今天我们先说说微服务最基础的框架SpringBoot。
SpringBoot是一套具有现代思想,为了完全解脱复杂配置而设计的快速开发框架,他提供了很多Enable*注解,只要使用对应的注解就会自动生成相应的配置文件,是不是很神奇,而且SpringBoot使用统一的配置文件application.properties,我们只需要在配置文件中定义必须的参数即可,然后我们就可以去开发我们的业务逻辑撸代码去了,是不是很爽。做过开发有几年的同志一定对开发环境的配置和搭建苦恼不已,往往大家都是更热衷于撸代码搞开发,而不是去搞环境,玩配置。因为环境往往不是天天搭建,而一整套环境搭建起来又非常复杂,所以Spring为了解决在代码中的配置就创造了SpringBoot,SpringBoot中包含了一个包AutoConfiguration,这个包专门用来处理配置相关管理,Spring已经封装了大部分主流的框架,单这还不够,作为一个专业撸代码的,自己做的代码怎么也能自动配置呢?这个很关键啊,是不是,也许有的人说了,提供的工具足够了啊,为什么还要自己开发呢?哈哈,这就说明了你还很嫩,还没有达到一定的高度,这里我不是说我是大牛,只是说明了一个态度,作为一个专业人员,一套框架的核心原理及精髓,我们还是需要去深入学习的,好了,说了半天也该来电干货了,先上代码,在根据代码详细说明。
为了开发自定义的Starter我们需要引入依赖spring-boot-autoconfigure,这个依赖是必须要引入的依赖,其他的依赖可以根据需要进行添加,接下来是spring-boot-configuration-processor,这个依赖也是必须要引入的,但是有个前提,那就是当你需要配置文件的时候@ConfigurationProperties(prefix = "spring.mystarter"),你就必须引入。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.easy.starter</groupId> <artifactId>MyStarter</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>2.0.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <version>2.0.4.RELEASE</version> </dependency> </dependencies> <build> <finalName>MyStarter</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
package com.easy.app.properties; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "spring.mystarter") public class MyProperties { private String msg = "This is a starter Demo!"; private boolean show = true; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public boolean isShow() { return show; } public void setShow(boolean show) { this.show = show; } }
package com.easy.app.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.easy.app.properties.MyProperties; import com.easy.app.service.MyService; @Configuration @EnableConfigurationProperties(MyProperties.class) @ConditionalOnClass(MyService.class) @ConditionalOnProperty(prefix = "mystarter", value = "enabled", matchIfMissing = true) public class MyConfiguration { @Autowired private MyProperties myProperties; @Bean @ConditionalOnMissingBean(MyService.class) public MyService helloService() { MyService myService = new MyService(); myService.setMsg(myProperties.getMsg()); myService.setShow(myProperties.isShow()); return myService; } }
package com.easy.app.service; public class MyService { private String msg; private boolean show = true; public String sayHello() { return show ? "Hello," + msg : "Hidden"; } public void setMsg(String msg) { this.msg = msg; } public void setShow(boolean show) { this.show = show; } }
下面的这段代码是开启自动配置的核心配置,是告诉Spring那个类是是自动配置的配置类。在src/main/resources下创建路径/META-INF/spring-factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.easy.app.config.MyConfiguration
虽然现在有了自动配置,但是我们还是需要在application.properties中配置参数,但是没有提示怎么办,没问题我们同样有办法,同样在src/main/resources下创建路径/META-INF/spring-configuration-metadata.json,配置好之后,我们在使用的时候就会出现配置了。
{ "hints": [], "groups": [ { "sourceType": "com.easy.app.properties.MyProperties", "name": "spring.mystarter", "type": "com.easy.app.properties.MyProperties" } ], "properties": [ { "sourceType": "com.easy.app.properties.MyProperties", "name": "spring.mystarter.msg", "type": "java.lang.String" }, { "sourceType": "com.easy.app.properties.MyProperties", "name": "spring.mystarter.show", "type": "java.lang.Boolean" } ] }