微服务入门java
单体应用web
“单体架构(monolith application)”就是将应用程序的全部功能都打包成一个独立的单元进行部署,能够是JAR、WAR、EAR或其它归档格式。spring
优势:设计模式
1.单个系统包含全部功能tomcat
2.部署简单springboot
3.易于测试网络
缺点:架构
1.代码臃肿、模块耦合度高、逻辑复杂、修改难度大mvc
2.编译、启动周期长app
3.系统错误隔离性差、可用性差,任何一个模块的错误都可能形成整个系统的宕机
4.可伸缩性差,系统的扩容只能只对这个应用进行扩容,不能作到对某个功能点进行扩容
5.线上问题修复周期长;任何一个线上问题修复须要对整个应用系统进行全面升级,版本迭代效率低
微服务
微服务:一种架构设计模式。业务逻辑被拆分红一系列小而松散耦合的分布式组件,每一个组件都被称为微服务,多个组件共同构成了较大的应用。
优势:
1.每一个服务足够内聚,足够小,代码容易理解、开发效率提升
2.服务之间能够独立部署,微服务架构让持续部署成为可能
3.提升容错性(fault isolation),一个服务的内存泄露并不会让整个系统瘫痪
4.系统不会被长期限制在某个技术栈上
缺点:
1.运维难度增长,问题追踪定位难度增长
2.团队依赖强,一个服务的版本延迟会拖慢整个应用的开发周期
3.开发难度、复杂度增长;垮服务的调用一般是不一样的机器,甚至是不一样的机房,开发人员须要处理超时、网络异常等问题
4.部署、测试难度增长
5.数据一致性问题
微服务
微服务架构
Dubbo:阿里服务化治理的核心框架。国内使用较多,表明性:
--新浪:Motan-dubbo裁剪版
--当当:DubboX-dubbo加强版
Dubbo 只是实现了服务治理,提供各类 Filter,能够经过扩展 Filter 来完善,如:
分布式配置:可使用淘宝的 diamond、百度的 disconf 来实现分布式配置管理。
服务跟踪:可使用京东开源的 Hydra,或者扩展 Filter 用 Zippin 来作服务跟踪。
批量任务:可使用当当开源的 Elastic-Job、tbschedule。
Spring Cloud:一系列框架的有序集合
--整合Netflix 组件
Spring Cloud基于Spring Boot实现了众多分布式系统基础设施,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,服务治理只是其中的一个方面。
Spring Cloud组件
Spring Cloud Netflix Eureka:服务注册与发现
Spring Cloud Netflix Zuul:服务网关
Spring Cloud Netflix Hystrix:断路器
Spring Cloud Ribbon:客户端负载均衡
Spring Cloud Feign:声明式服务调用
Spring Cloud Config:分布式配置
Spring Cloud Sleuth:服务跟踪
Spring Cloud Bus:消息总线
…
组件参考:https://springcloud.cc/
简单微服务
准备工做:
技能要求:熟悉Spring Mvc、Spring注解熟悉
工具环境:
Maven:3.X
开发工具:Eclipse oxygen、Spring Tool Suite(STS)、IDEA
JDK:1.8版本
Spring Boot:1.5.7.RELEASE
构建Maven项目
1、经过SPRING INITIALIZR构建maven项目:
2、手动构建:
1.新建spring-boot-helloword文件
2.新建文件夹src/main/java、src/main/resources、src/test/java、src/test/resources
2.新建pom.xml文件,内容:
<modelVersion>4.0.0</modelVersion>
<groupId>fun.deepsky.springboot</groupId>
<artifactId>spring-boot-helloword</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-boot-helloword</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Spring Boot Starter
Spring Boot Starter:
在Spring Boot生态中被称为Starter POMs,是一系列的轻便依赖包,是一套一站式Spring相关技术的解决方案,开发者在使用和整合时,没必要关注依赖配置,只须要引入对应的模块便可。
如开发web应用,只须要引入spring-boot-starter-web,Starter会自动引入如下jar包:
■ org.springframework.boot:spring-boot-starter
■ org.springframework.boot:spring-boot-starter-tomcat
■ org.springframework.boot:spring-boot-starter-validation
■com.fasterxml.jackson.core:jackson-databind
■ org.springframework:spring-web
■ org.springframework:spring-webmvc
主类
建立Application.java:
@SpringBootApplication
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);//①
}
@RequestMapping(“/index”) //②
public String index() {
return "hello world";
}
}
①:对容器进行参数,经过SpringApplicationBuilder来对SpringApplication的属性进行配置。如
new SpringApplicationBuilder(Application.class).bannerMode(Mode.OFF).web(true).run(args);
②:增长web访问路径,默认为get访问
启动,访问:http://localhost:8080/index