[TOC]
# 第一周的学习的工作报告
## day1_学习微服务的框架开发指引:cmpay quick starter
## 微服务结构的基础了解
### 1. 什么是微服务架构?
在了解什么是微服务架构之前,我先联想到的是我之前接触过的一些架构.一开始在我刚学习Java的时候,我们所做的项目是直接把应用整体进行打包部署的.具体的样式的话,像java就是打成war包部署在tomcat上,然后是springboot的话是可以打成jar包的.
微服务架构则是将单个的整体应用程序分割成更小的项目关联的独立的服务。一个服务通常实现一组独立的特性或功能,包含自己的业务逻辑和适配器。各个微服务之间的关联通过暴露api来实现。这些独立的微服务不需要部署在同一个虚拟机,同一个系统和同一个应用服务器中。
###2. 为什么需要微服务架构?
单一架构模式在项目初期很小的时候开发方便,测试方便,部署方便,运行良好。可是当应用随着时间的推进,加入的功越来越多,最终会变得巨大,一个项目中很有可能数百万行的代码,互相之间繁琐的jar包。
1、不再适用敏捷开发,过于复杂,任何开发者都不能够完全理解,修复漏洞和实现新功能变得困难和耗时。
2、规模越大,启动时间越长,自然会拖慢开发进度,一个小功能的修改部署起来变得困难,必须重新部署整个应用。
3、系统的不同的模块的需要不同的特定的虚拟机环境时,由于是整体应用,那么只能折中选择。
4、任意模块的漏洞或者错误都会影响这个应用,降低系统的可靠性
5、还有一个如果想整体应用采用新的技术,新的框架或者语言,那是不可能的。
如果采用微服务架构模式,则可以解决单一架构模式带来的系统复杂性。主要包括以下几个好处:
1、由于每个服务都是独立并且微小的,由单独的团队负责,仍然可以采用敏捷开发模式,自由的选择合适的技术,甚至可以重写老服务,当然都要遵守统一的API约定。
2、 每一个微服务都是独立部署的,可以进行快速迭代部署,根据各自服务需求选择合适的虚拟机和使用最匹配的服务资源要求的硬件。
3、整体应用程序被分解成可管理的模块和服务,单个的服务可以更快的开发、更简单的理解和维护。
4、 一些需要进行负载均衡的服务可以部署在多个云虚拟机上,加入NGINX这样的负载均衡器在多个实例之间分发请求,这样不需要整个应用进行负载均衡了。
每个后端服务暴露一套REST API,大部分服务调用其他服务提供的API。每个服务都有自己的数据库模式,而不是共享单个数据库模式。尽管这会造成某些数据的冗余,但是对于微服务架构这个独立数据库模式是必要的,确保了独立服务之间的松散耦合。
以上介绍的微服务架构模式表面上类似于SOA,两种架构都包含一组服务。可以认为微服务架构是不包括Web服务规范(WS-)、企业服务总线(ESB)的SOA。基于微服务的应用倾向于使用更简单轻量级的协议,比如 REST 而不是 WS-。微服务自己实现类似 ESB 的功能并且拒绝 SOA 的其他部分,比如规范模式的概念。
###3.关于微服务的一些缺点
微服务缺点
1、微服务应用作为分布式系统带来了复杂性。当应用是整体应用程序时,模块之间调用都在应用之内,即使进行分布式部署,依然在应用内调用。可是微服务是多个独立的服务,当进行模块调用的时候,分布式将会麻烦。
2、多个独立数据库,事务的实现更具挑战性。
3、测试微服务变得复杂,当一个服务依赖另外一个服务时,测试时候需要另外一个服务的支持。
4、部署基于微服务的应用也很复杂,整体应用程序部署只需要部署在一组相同的服务器上,在这些服务前面加入传统的负载均衡器即可。独立服务的不是讲变得复杂,需要更高的自动化形式。
## cmpay quick start的学习
###1.学习Gradle
了解 Grade的配置文件
cmpay-quick-starter的配置文件学习.
buildscript是用来声明gradle脚本自身需要使用的资源,包括依赖项,第三方插件,maven仓库地址等.
buildscript {
repositories {
//添加我们的仓库
// 声明仓库的源。可以使用jcenter()来声明也可以.jcenter()中兼容了maven的中心仓库
maven { url "http://10.9.10.115:8081/repository/maven-public/" }
}
//配置全局变量
ext {
springBootVersion = '1.5.10.RELEASE'
lemonVersion = '1.0.0-SNAPSHOT'
cmpayVersion = '1.0.0-SNAPSHOT'
sonarUrl="http://172.16.50.222:9000/"
}
//添加依赖
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.5")
classpath("com.cmpay:lemon-plugin:${lemonVersion}")
}
}
subprojects{}这个里面的东西声明了子项目中要用到的资源.
//配置签名
configure{}这个地方我暂时还不出来有什么作用.
###2.运行我们的consumer子项目和user子项目
在使用Gradle进行builder的时候会出现不可编译字符的错误,然后就是在执行ConsumerApplication的mian方法的时候会出现he server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone.
You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.所述错误.
解决方法是:在我们的bootstrap-dev.yml配置文件下
dataSources :
primary :
url : jdbc:mysql://localhost:3306/seatelpay?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=true
改成这个就能通过编译,然后在执行main方法的时候不会出现上述的sql异常.最后的useSSL指的是配置的mysql版本和自己本地的不一致时,要为true.
然后执行main方法就可以成功了.
## 今日学习总结
通过今天的学习,我了解到了Gradle的用法,然后是在对cmpay的一些基本的配置.在我们的开发环境中,我们需要引入spring_redis,rabbitmq , idgen ,cache ,redisson,eureka ,lemon_datasource,这些东西都有在我们的bootstrap中有体现.但是我不清楚为什么要这么引入.然后引入的作用和我们的lemon的框架有什么联系?这些还待自己好好了解.
## 明天目标
了解springcloud 和lemon-quick-start