初学微服务,首先要明晰微服务架构,微服务,是什么?
微服务:套用微服务的提出者马丁·夫勒的论文定义:
业界大牛 马丁.福勒(Martin Fowler )这样描述微服务:
论文网址:https://martinfowler.com/articles/microservices.html#MicroservicesAndSoa
中文版翻译网址:http://blog.cuicc.com/blog/2015/07/22/microservices/
微服务架构:
简单来说,微服务架构风格[1]是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源RESTful API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。
微服务:
强调的是服务的大小,是具体解决某个问题的具体应用。
优点:
每个服务足够内聚,足够小,代码容易理解这样聚焦一个指定的业务或者业务要求
开发简单,开发效率足够高,一个服务可能就是专一的干一件事
微服务能够被小团体单独开发,这个小团体是2-5的开发人员
微服务是松耦合的,有功能意义的服务,无论在开发夹断还是再部署阶段都是独立的
微服务能狗使用单独的语言开发
易于第三方集成,微服务允许容易且灵活的方式自动部署,通过持续集成工具,如Jenkins,Hudson,banboo
微服务易于被开发人员理解,修改和维护,这样小团体能够关注自己的工作成果。无需通过合作体现价值
微服务允许你融合最新的技术
微服务只是业务逻辑的代码,不会和Html,CSS或其他页面组件混合
缺点:
开发人员要处理分布式系统的复杂性
多服务运维难度增加,随着服务的增加,运维的难度也在增加
系统依赖部署
服务i间通信成本
数据一致性
。。。。
前言
Spring Cloud 为构建分布式系统和微服务提供了一些通用的工具,例如:
配置中心
服务注册与发现
熔断器
路由
代理
控制总线
一次性令牌
全局锁
leader选举
分布式 会话
集群状态等。
目前国内有很多公司还是使用dubbo做服务分解,但dubbo只提供了服务注册发现功能,要建立分布式系统还要自己找对应工具进行组合,当然这样定制性、灵活性高,但有些技术要摸着走,而且阿里已经停止了对dubbo的更新(2017重新启动了)。
如果采用Spring Cloud技术栈,Spring Cloud提供了分布式系统和微服务中所需要的约大多数公共模块和功能,
Spring Cloud 下各项目都是基于 Spring Boot 的,所有要想用Spring Cloud做微服务开发,最好先掌握 Spring Boot。
下表是dubbox与Spring Cloud技术栈对比:
功能 | Dubbox | Spring Cloud |
---|---|---|
服务注册中心 | Zookeeper | Spring Cloud Netflix Eureka |
服务调用方式 | RPC/REST API | REST API |
服务网关 | 无 | Spring Cloud Netflix Zuul |
服务网关 | 无 | Spring Cloud Netflix Zuul |
分布式配置 | 无 | Spring Cloud Config |
服务跟踪 | 无 | Spring Cloud Sleuth |
消息总线 | 无 | Spring Cloud Bus |
数据流 | 无 | Spring Cloud Stream |
批量任务 | 无 | Spring Cloud Task |
打个不恰当的比喻:
使用Dubbo构建的微服务架构就像组装电脑,各环节我们的选择自由度很高,但是最终结果很有可能因为一条内存质量不行就点不亮了,总是让人不怎么放心,但是如果你是一名高手,那这些都不是问题;而Spring Cloud就像品牌机,在Spring Source的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性,但是如果要在使用非原装组件外的东西,就需要对其基础有足够的了解。
下面是对springcloud工具的各种实战:
Eureka 服务注册与发现:
eureka注册中心:
pom文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-eureka-7001</artifactId>
<dependencies>
<!--eureka-server服务端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
配置文件:(供参考,其中有些配置需要按照自己的需求修改)
erver:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ #集群配置,为其他的服务注册中心地址
spring boot启动类:
采用注解的方式加载某些组件:
@SpringBootApplication
@EnableEurekaServer
public class Applicaion_server_7001 {
public static void main(String args[]){
SpringApplication.run(Applicaion_server_7001.class,args);
}
}
这样启动了版可以通过:localhost:7001看看服务中心
Eureka客户端:(服务注册)
pom:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-provider-dept-8001</artifactId>
<dependencies>
<!-- 引入自己定义的api通用包,可以使用Dept部门Entity -->
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- actuator监控信息完善 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 将微服务provider侧注册进eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<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>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
配置文件:
erver:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: com.atguigu.springcloud.entities # 所有Entity别名类所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
application:
name: microservicecloud-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://localhost:3306/cloudDB01 # 数据库名称
username: root
password: pps123
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ #服务注册中心地址
instance:
instance-id: microservicecloud-dept8001 #设置服务注册的名称
prefer-ip-address: true #设置超链接可以显示IP
info:
app.name: pps
company: pps
build.artifactId: $project.artifactId$
build.version: $project.version$
@SpringBootApplication
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
@EnableDiscoveryClient //服务发现
public class DeptProvider8001_App {
public static void main(String... args){
SpringApplication.run(DeptProvider8001_App.class, args);
}
}
当服务注册成功后可以再注册中心看到具体注册的服务名
Ribbon简介
Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。
在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。展示了Ribbon与Eureka配合使用时的架构。
未完待续。。。