一.单体应用
1.什么是单体引用?
通常情况下,这个服务所对应的代码由多个项目所组成,各个项目会根据自身所提供功能的不同具有一个明确的边界。在编译时,这些项目将被打包成为一个个JAR包,并最终合并在一起形成一个WAR包
2.优缺点
①一个模块挂了,整个项目都受影响
②单个tomcat更能处理的并发有限,可以做集群,但是不方便局部(某一个模块)扩展
③维护/开发/升级比较麻烦
④代码臃肿,编译,打包都比较慢
⑤技术选型单一
⑥数据库选型单一
二、微服务架构
1.什么是微服务架构
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。
微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被技术选项,独立开发,独立部署,独立运维,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
简而言之:微服务就是把一个大的系统,拆分成多个小的服务,每个微服务只专注一个业务 ,每个服务有各自的进程, 微服务之间使用网络通信协议进行数据交互(通常是基于HTTP的RESTful API)。
2.微服务远程调用方式
RPC:Remote Produce Call远程过程调用,类似的还有RMI。自定义数据格式,基于原生TCP通信,速度快,效率高。早期的webservice,现在热门的dubbo,都是RPC的典型
Http:http其实是一种网络传输协议,基于TCP,规定了数据传输的格式。现在客户端浏览器与服务端通信基本都是采用Http协议。也可以用来进行远程服务调用。缺点是消息封装臃肿。
现在热门的Rest风格,就可以通过http协议来实现
2.1rpc和http的比较
RPC并没有规定数据传输格式,这个格式可以任意指定,不同的RPC协议,数据格式不一定相同。
- Http中还定义了资源定位的路径,RPC中并不需要
- 最重要的一点:RPC需要满足像调用本地服务一样调用远程服务,也就是对调用过程在API层面进行封装。Http协议没有这样的要求,因此请求、响应等细节需要我们自己去实现。
- 优点:RPC方式更加透明,对用户更方便。Http方式更灵活,没有规定API和语言,跨语言、跨平台
- 缺点:RPC方式需要在API层面进行封装,限制了开发的语言环境
速度来看,RPC要比http更快,虽然底层都是TCP,但是http协议的信息往往比较臃肿,不过可以采用gzip压缩。
- 难度来看,RPC实现较为复杂,http相对比较简单
- 灵活性来看,http更胜一筹,因为它不关心实现细节,跨平台、跨语言。
因此,两者都有不同的使用场景:
- 如果对效率要求更高,并且开发过程使用统一的技术栈,那么用RPC还是不错的。 dubbo
- 如果需要更加灵活,跨语言、跨平台,显然http更合适 springcloud
3.微服务的优缺点
优点:
①数据库选型多样化
② 技术选型多样化
③每个微服务专注一个业务
④ 每个维护有自己的进程
⑤ 微服务之间通过网络协议进行通信
⑥方便做局部拓展
⑦ 开发/维护/升级更方便
缺点:
①成本高
② 技术要求比较高
③部署麻烦
4.MicroService实现技术
1.是一种架构的理念,提出了微服务的设计原则,从理论为具体的技术落地提供了指导思想。
2.java中可以使用传统ssm ssj等架构,当然更加推荐Springboot。Spring Boot是一套快速配置脚手架,可以基于Spring Boot快速开发单个微服务。
3.由于微服务架构中存在多个微服务,那么如何管理和协调这些服务呢?就需要服务治理框架,而springcloud就是一个基于Spring Boot实现的服务治理工具包。
3.Spring cloud
Spring cloud是什么?
Spring cloud是一个基于Spring Boot实现的服务治理工具包,用于微服务架构中管理和协调服务的。
组成:
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Springcloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
五大组成:
注册中心与服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon\Feign
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
5.注册中心的使用
1.创建一个父maven文件,在pom中导入springboot的jar包和springcloud的jar包。
<!--公共的utf-8-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--管理springboot-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<!--管理springcluod-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version><!-- eureka版本 -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--公共web包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--公共的junit包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.创建子maven(eureka-service-1111当作服务器端),pom中导入服务端相应的jar包
<dependencies>
<!--spring-cloud注册中心服务端jar包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
2.1创建主配置类——EurekaServiceApplication
//@EnableEurekaServer 开启注册中心(服务端)
@SpringBootApplication
@EnableEurekaServer
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class);
}
}
2.2resources中创建application.xml
server:
port: 1111 #服务器端接口
eureka:
instance:
hostname: localhost #主机名
client:
registerWithEureka: false #注册中心不注册自身信息
fetchRegistry: false #注册中心不获取注册地址清单
serviceUrl: #注册中心地址
defaultZone: http://locahost:1111/eureka/
server:
enable-self-preservation: false #注册中心自我保护机制关闭
3.创建子maven(order-service-consumer-2222客户端——消费者),pom中导入客户端相关的jar包
<dependencies>
<!--注册中心客户端导入的jar包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--spring-boot的web包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3.1创建主配置类——OrderServiceCondumerApplication
@SpringBootApplication
@RestController
public class OrderServiceCondumerApplication {
@RequestMapping("/")
public String home() {
return "Hello world";
}
public static void main(String[] args) {
SpringApplication.run(OrderServiceCondumerApplication.class);
}
}
3.2resources中创建application.xml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka/ #注册中心的地址
instance:
instance-id: order-server:2222 #指定id,指定客户端名字
prefer-ip-address: true #使用ip注册到注册中心
server:
port: 2222 #客户端端口号
spring:
application:
name: order-server #客户端名字
4.创建子maven(user-service-provider-3333 客户端,提供者),pom中导入客户端相应的jar包
<dependencies>
<!--注册中心客户端导入的jar包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--spring-boot的web包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
4.1创建主配置类(UserServiceProviderApplication)
@SpringBootApplication
@RestController
public class UserServiceProviderApplication {
@RequestMapping("/")
public String home() {
return "Hello world";
}
public static void main(String[] args) {
SpringApplication.run(UserServiceProviderApplication.class);
}
}
4.2resources中创建application.xml
eureka:
client: #客户端
serviceUrl:
defaultZone: http://localhost:1111/eureka/ #注册中心地址
instance:
prefer-ip-address: true #用ip注册到注册中心
instance-id: user-service:3333 # 指定id
server:
port: 3333 #客户端端口号
spring:
application:
name: user-service #客户端名字
6.效果图
注册中心系我保护机制(设置的是关闭状态)
添加的服务(消费者和提供者)
点击status,ip回显