SpringCloud学习-(1)扫盲
微服务的九大特性:
1, 服务组件化
2, 按业务组织团队
3, 做“产品”的态度
4, 智能端点(Http接口可读性)
5, 去中心化治理(不同特点不同语言实现)
6, 去中心化管理数据(不同特点不同数据库,去事务,最终一致性)
7, 基础设施自动化(自动化测试、自动化部署)
8, 容错设计(自我治理和自动恢复)
9, 演进式设计
这九大特性每一点都扩展很深,几乎每一条就决定了最终能否走向成功。例如第三点什么是“产品”的态度?就是不计人力成本、技术不受约束、以可持续发展的思路设计实现,这一点往往是传统软件行业不具备的。你的客户给你采购各种收费的大厂商的组件逼着用在你的应用里,给你规定了很苛刻的交付结点,你的领导受制于压力不愿意投入过多的预研成本,客户提出各种天马行空毫无用处又非标准化的需求需要你去实现等等,这些都会导致微服务的失败。
选择Spring Cloud来做微服务框架,也是基于以上4、5、6、7、8的要求,Spring Cloud提供了很好的组件,后续我们会一一详细介绍,在开始学习Spring Cloud之前我们需要做好几点工作。
第一, IOC和AOP
依赖注入和面向切面编程有啥好讲的?这里要说的不是它的思想(相信所有java从业人员对于IOC和AOP都有了概念上的了解),而是在Spring中的用法。
IOC的三种方式:XML,Annotation和Java Configuration,需要掌握后两种。
第一种:XML这里不多讲了,Spring最最原始的用法,问题也超多,维护繁琐不说,在生产应用中经常出现xml配置文件与class类不同步引起找不到set方法、找不到bean、nullpoint等问题。
第二种:Annotation,分两种:声明注解(@Component、@Service、@Repository、@Controller)和注入注解(@Autowired、@Inject、@Resource),每一层的注解本质都是一样的,场景上有细微的区别:
声明:@Service、@Repository、@Controller分别对应着Service层、Dao层、Action层,@Component比较*,没有明确的角色。
注入:@Autowired和@Resource用的比较多,一个按照类型注入,一个按照名字注入。
第三种:Java Configuration,这也是Spring4.X开始在微服务中主推的方式。
@Configuration声明当前是一个配置类,@Bean声明当前方法返回一个bean,名称默认为方法名。
AOP XML的方式也被淘汰了,原因也是维护太难灵活度不够,我们需要掌握5种类型1个注解2种流派。
5种类型:前置通知(Before advice)、后置通知(After advice)、返回后通知(Afterreturn advice)、环绕通知(Around advice)、异常后通知(After throwing advice)。
1个注解:@Aspect,该注解定义一个切面,可以灵活松耦合的织入我们系统。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogAnnotation {
String logValue() default "yejingtao";
}
@Aspect
@Component
//流派一:统一定义织入点
public class LogAspect {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Pointcut("@annotation(hello.annotation.LogAnnotation)")
private void cut() { }
@Around("cut()")
public void advice(ProceedingJoinPoint joinPoint){
logger.info("----环绕通知之开始----");
try {
joinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
logger.info("----环绕通知之结束----");
}
}
@Aspect
@Component
//流派二:各自织入各自的
public class LogAspectOther {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Around("@annotation(hello.annotation.LogAnnotation)")
public void advice(ProceedingJoinPoint joinPoint){
logger.info("----环绕通知之开始----");
try {
joinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
logger.info("----环绕通知之结束----");
}
}
上面两种流派效果都是一样的,各有各的好处,自己可以分析下
@hello.annotation.LogAnnotation
Student findByName(String code);
第二, Spring Boot
Spring Boot的核心是启步依赖和自动配置,还配套有单元测试、多节点启动、Actuator等。
启步依赖就是解决了我们开发过程中各种jar包依赖和冲突的问题,按我们每种使用场景只需要依赖Spring测试好的包就可以了。例如要做权限控制,就引入spring-boot-starter-security就好了。
自动配置是通过condition接口matches()方法做了大量的判断,让你一键式引入满足多种场景。
@[email protected][email protected][email protected],这个公式是SpringBoot的核心。
Spring boot还提供了Junit单元测试和2种web测试的功能(Spring MockMVC、嵌入式servlet容器执行测试),微服务对测试代码要求更高,否则将会是灾难性的结果。
第三:Spring Boot和Spring Cloud的关系。
语法上没任何区别,都是在Application中添加用到的注解,依赖自己的包。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--注意,如果这里springboot使用的是2.x,那么引入的jar应该是下面的
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
-->
</dependencies>
从上面Maven配置来看,我们需要知道哪些是属于Spring Boot的,哪些是输入Spring Cloud的。我自己的理解是真正与你产品业务相关的去Spring Boot里去找,例如Web、Security、Data等,脱离业务独立辅助功能去Spring Cloud里去找,例如Eureka、Bus、Config、Feign、Stream、Zuul、Sleuth等。当然古人云知之为知之,不知为不知,还是每个组件都去认真学习下才是硬道理。
在学习Spring Cloud中根据网络上各种材料经常发现别人测试好的例子自己缺编译或运行错误,经过无数次从坑中爬起终于发现一下2点是教材里都忽略掉的。
第一:Maven仓库本身有问题,最终找到比较好的仓库是aliyun的。
第二:Spring Boot和Spring Cloud版本之间有依赖,一定要选对版本。规则也很简单,Cloud Angel对应Boot的1.2.X,Brixton对应1.3.X,Camden对应1.4.X,Dalston对应1.5.X。
简言之:Spring微服务是一艘航母,真正提供战斗力的是舰载机(Spring Boot),提供加油、雷达、甲板等辅助功能的是Spring Cloud。
转自:https://blog.csdn.net/yejingtao703/article/details/77370347