前段时间比较热衷于架构方面的知识,微服务自然不再话下。我学东西向来不会勉强自己,任何事情总是有个过程,从听说Spring Boot 到了解,到学习,到实践每一个环节都有不同的理解,温故而知新,简单总结一下。
接触SpirngBoot前大都接触的是SSH,SSM之类的框架组合,搭建一个SSM框架应该考虑到每个独立的开源项目在该项目中扮演的角色,其次该框架所管理的逻辑范围以SSM(Spring,SpringMVC,MyBatis)为例:
- Spring扮演一个全局的管理者角色,IOC容器能够很出色的完成这个任务,可以说任何JavaBean对象都可以被IOC容器管理起来,常见的连接池对象、单例对象、Service对象、事物对象、等等,由于Spring的特性可以让一个应用程序以比较特殊的方式来运行示例如下:
@Component @PropertySource("classpath:conf/kafka.properties") public class KafkaUtil implements ApplicationContextAware { public static Logger Log = Logger.getLogger(KafkaUtil.class); @Value("${tvc.kafka.enable}") private Boolean useKafka; public Boolean getUseKafka() { return useKafka; } public void setUseKafka(Boolean useKafka) { this.useKafka = useKafka; } @Value("${tvc.kafka.zkHost}") private String zkHost; @Value("${tvc.kafka.group}") private String group; @Value("${tvc.kafka.topic}") private String topic; @Value("${tvc.kafka.numThread}") private Integer numThreads; @Value("${tvc.kafka.autooffset.reset}") private String autoOffset; public String getAutoOffset() { return autoOffset; } public void setAutoOffset(String autoOffset) { this.autoOffset = autoOffset; } private ConsumerConnector consumer; private ExecutorService executor; @PostConstruct public void init() { if (!useKafka) { Log.debug("Kafka Module Is Disabled!"); return; } consumer = Consumer.createJavaConsumerConnector(createConsumerConfig(zkHost, group, autoOffset)); Map<String, Integer> topicCountMap = new HashMap<String, Integer>(); topicCountMap.put(topic, new Integer(numThreads)); Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCountMap); List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic); executor = Executors.newFixedThreadPool(numThreads); for (final KafkaStream<byte[], byte[]> stream : streams) { ThreadWork threadWork = context.getBean(ThreadWork.class, stream); // ThreadWork threadWork = new ThreadWork(stream); executor.submit(threadWork); } } private static ConsumerConfig createConsumerConfig(String zookeeper, String groupId, String autoOffset) { Properties props = new Properties(); props.put("zookeeper.connect", zookeeper); props.put("group.id", groupId); props.put("auto.commit.interval.ms", "1000"); props.put("zookeeper.session.timeout.ms", "400"); props.put("zookeeper.sync.time.ms", "2000"); props.put("auto.commit.interval.ms", "1000"); props.put("auto.offset.reset", autoOffset); props.put("fetch.size", "" + (1024 * 1024 * 5)); Log.debug("Kafka Params:" + props.toString()); return new ConsumerConfig(props); } @Override public String toString() { return "KafkaUtil [zkHost=" + zkHost + ", group=" + group + ", topic=" + topic + ", numThreads=" + numThreads + ", consumer=" + consumer + ", executor=" + executor + "]"; } private ApplicationContext context; @Override public void setApplicationContext(ApplicationContext context) throws BeansException { this.context = context; } }
- Spring MVC与Spring一脉相承,其简洁更加轻量级的配置在MVC框架中脱颖而出,不再赘述。
- MyBatis一解Hibernate的高度封装性,更加灵活和轻量级,笔者曾使用过Spring的JDBC框架也环视满容易上手的,值得一试。
继续来说说SpringBoot,首先应该为它的便捷而喝彩,一句话SpringBoot 组合了Spring+SpringMVC等通过一系列的注解和Maven POM文件将常用的开源组件很好的整合起来,为迅速的搭建一个混合框架寻得一条出路。示例如下:
@SpringBootApplication
@ImportResource("classpath:conf/spring.xml")
public class TvcCloudToJM {
public static void main(String[] args) {
if (Lock.isLocking("jm.lock")) {
System.out.println("One Instance Already Running!!");
System.exit(1);
}
final ConfigurableApplicationContext context = SpringApplication.run(TvcCloudToJM.class, args);
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
context.stop();
}
}));
}
}
上述代码将启动一个SpringBoot的应用程序,无缝集成Spring,SpringMVC等框架。总结如下:
- 定义了若干常用的Maven POM文件,导入一个POM文件关联组建一并导入
- 自动发现依赖组件,如:如果引用了标识Web项目的POM文件则项目自动以Web形式加载启动,SpringBoot自动处理Tomcat等配置项
- SpringBoot混淆了以往对SSMSSM架构的认识,符合服务发展的趋势提升服务内聚性降低服务间耦合性,自然对SpirngBoot而言使用Spirng SpringMVC等技术都是常态,SpringBoot更像是一个大的框架,整合了若干小的框架。
- SpringBoot提供了更好的配置文件管理方式YARN格式配置文件,更便捷的属性文件到JavaBean属性的绑定。
官方示例:
@Controller
@EnableAutoConfiguration
public class SampleController {
@RequestMapping("/")
@ResponseBody
String home() {
return "Hello World!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(SampleController.class, args);
}
}