1.微服务概述
1.1 什么是微服务?
微服务(Microservice Architecture) 是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。究竟什么是微服务呢?我们在此引用ThoughtWorks 公司的首席科学家 Martin Fowler 于2014年提出的一段话:
- 原文:https://martinfowler.com/articles/microservices.html
- 汉化:https://www.cnblogs.com/liuning8023/p/4493156.html
就目前而言,对于微服务,业界并没有一个统一的,标准的定义。但通常而言,微服务架构是一种架构模式,或者说是一种架构风格,它体长将单一的应用程序划分成一组小的服务,每个服务运行在其独立的自己的进程内,服务之间互相协调,互相配置,为用户提供最终价值,服务之间采用轻量级的通信机制(HTTP)互相沟通,每个服务都围绕着具体的业务进行构建,并且能狗被独立的部署到生产环境中,另外,应尽量避免统一的,集中式的服务管理机制,对具体的一个服务而言,应该根据业务上下文,选择合适的语言,工具(Maven)对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。
再来从技术维度角度理解下:
微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事情,从技术角度看就是一种小而独立的处理过程,类似进程的概念,能够自行单独启动或销毁,拥有自己独立的数据库。
1.2 微服务与微服务架构
微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题/提供落地对应服务的一个服务应用,狭义的看,可以看作是IDEA中的一个个微服务工程,或者Moudel。IDEA 工具里面使用Maven开发的一个个独立的小Moudel,它具体是使用SpringBoot开发的一个小模块,专业的事情交给专业的模块来做,一个模块就做着一件事情。强调的是一个个的个体,每个个体完成一个具体的任务或者功能。
微服务架构是一种架构模式,由Martin Fowler 于2014年提出。它通常将单一应用程序划分成一组小的服务,服务之间相互协调,互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务之间采用轻量级的通信机制(如HTTP)互相协作,每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境中,另外,应尽量避免统一的,集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具(如Maven)对其进行构建。
1.3 微服务优缺点
优点
- 单一职责原则;
- 每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个- 指定的业务功能或业务需求;
- 开发简单,开发效率高,一个服务可能就是专一的只干一件事;
- 微服务能够被小团队单独开发,这个团队只需2-5个开发人员组成;
- 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的;
- 微服务能使用不同的语言开发;
- 易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如jenkins,Hudson,bamboo;
- 微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果,无需通过合作才能体现价值;
- 微服务允许利用和融合最新技术;
- 微服务只是业务逻辑的代码,不会和HTML,CSS,或其他的界面混合;
- 每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一的数据库;
缺点
- 开发人员要处理分布式系统的复杂性;
- 多服务运维难度,随着服务的增加,运维的压力也在增大;
- 系统部署依赖问题;
- 服务间通信成本问题;
- 数据一致性问题;
- 系统集成测试问题;
- 性能和监控问题;
1.4 微服务技术栈有那些?
Dubbo | SpringCloud | |
---|---|---|
服务注册中心 | Zookeeper | Spring Cloud Netfilx Eureka |
服务调用方式 | RPC | REST API |
服务监控 | Dubbo-monitor | Spring Boot Admin |
断路器 | 不完善 | Spring Cloud Netfilx Hystrix |
服务网关 | 无 | Spring Cloud Netfilx Zuul |
分布式配置 | 无 | Spring Cloud Config |
服务跟踪 | 无 | Spring Cloud Sleuth |
消息总栈 | 无 | Spring Cloud Bus |
数据流 | 无 | Spring Cloud Stream |
批量任务 | 无 | Spring Cloud Task |
2.SpringCloud概述
2.1 Spring Cloud 是什么?
Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性简化了分布式系统的开发,比如服务发现、服务网关、服务路由、链路追踪等。Spring Cloud 并不重复造轮子,而是将市面上开发得比较好的模块集成进去,进行封装,从而减少了各模块的开发成本。换句话说:Spring Cloud 提供了构建分布式系统所需的“全家桶”。
Spring官网:https://spring.io/
2.2 SpringCloud和SpringBoot的关系
- SpringBoot专注于快速、方便的开发单个个体微服务;
- SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务,整合并管理起来,为各个微服务之间提供:配置管理、服务发现、断路器、路由、为代理、事件总栈、全局锁、决策竞选、分布式会话等等集成服务;
- SpringBoot可以离开SpringCloud独立使用,开发项目,但SpringCloud离不开SpringBoot,属于依赖关系;
- SpringBoot专注于快速、方便的开发单个个体微服务,SpringCloud关注全局的服务治理框架;
2.3 SpringCloud能干嘛?
- Distributed/versioned configuration 分布式/版本控制配置
- Service registration and discovery 服务注册与发现
- Routing 路由
- Service-to-service calls 服务到服务的调用
- Load balancing 负载均衡配置
- Circuit Breakers 断路器
- Distributed messaging 分布式消息管理
2.4 自学参考书
- SpringCloud Netflix 中文文档:https://springcloud.cc/spring-cloud-netflix.html
- SpringCloud 中文API文档(官方文档翻译版):https://springcloud.cc/spring-cloud-dalston.html
- SpringCloud中国社区:http://springcloud.cn/
- SpringCloud中文网:https://springcloud.cc
2.5 总体架构图
- 注册中心:nacos,替代方案eureka、consul、zookeeper
- 配置中心: nacos ,替代方案sc config、consul config
- 服务调用:feign,替代方案:resttempate
- 熔断:sentinel,替代方案:Resilience4j
- 熔断监控:sentinel dashboard
- 负载均衡:sc loadbalancer
- 网关:spring cloud gateway
- 链路:spring cloud sleuth+zipkin,替代方案:skywalking等。
3.使用nacos作为注册中心
3.1 下载nacos,并启动
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。下载地址https://github.com/alibaba/nacos/releases,下载最新版的2.0版本。
下载完成后,解压,在解压后的文件的/bin目录下,windows系统点击startup.cmd就可以启动nacos。linux或mac执行以下命令启动nacos。
sh startup.sh -m standalone
登陆页面:http://localhost:8848/nacos/,登陆用户nacos,登陆密码为nacos。
- 极致省事版-docker安装
# 拉取nacos容器镜像
docker pull nacos/nacos-server
# 快速启动nacos服务容器
docker run -d --name nacos -p 8848:8848 -e MODE=standalone nacos/nacos-server
3.2 工程案例
父工程pom文件引入相关的依赖
<!-- spring boot 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2022.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud alibaba 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0-RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
服务提供者provider
- 在provider的pom文件引入依赖:
<!-- spring-boot-starter-web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- nacos注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2022.0.0.0-RC1</version>
</dependency>
- 配置文件application.yml:
server:
port: 8762
spring:
application:
name: provider
cloud:
nacos:
discovery:
server-addr: 172.19.112.2:8848
- 写一个接口:
@SpringBootApplication
@RestController
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
@Value("${server.port}")
String port;
@GetMapping("/hi")
public String hi(@RequestParam(value = "name", defaultValue = "feign",required = false) String name) {
return "hello " + name + ", i'm provider ,my port:" + port;
}
}
- 运行并查看nacos管理界面
服务消费者consumer
在pom文件引入以下依赖:
需要注意的是引入openfeign,必须要引入loadbalancer,否则无法启动。
<!-- spring-boot-starter-web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- nacos-discovery依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2022.0.0.0-RC1</version>
</dependency>
<!-- openfeign依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>4.0.4</version>
</dependency>
<!-- loadbalancer依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>4.0.4</version>
</dependency>
- 配置文件application.yml:
server:
port: 8763
spring:
application:
name: consumer
cloud:
nacos:
discovery:
server-addr: 172.19.112.2:8848
- 在工程的启动文件开启FeignClient的功能:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
- 写一个FeignClient,去调用provider服务的接口:
@FeignClient(value = "provider" )
public interface ProviderClient {
@GetMapping("/hi")
String hi(@RequestParam(value = "name", defaultValue = "feifn", required = false) String name);
写一个接口,让consumer去调用provider服务的接口:
@RestController
public class ConsumerController {
@Autowired
ProviderClient providerClient;
@GetMapping("/hi-feign")
public String hiFeign(){
return providerClient.hi("feign");
}
}
- 运行并查看nacos管理界面
3.3 服务调用
在浏览器上输入http://localhost:8763/hi-feign,浏览器返回响应:
hello feign, i'm provider ,my port:8762
可见浏览器的请求成功调用了consumer服务的接口,consumer服务也成功地通过feign成功的调用了provider服务的接口。
3.4使用sc loadbanlancer作为负载均衡
其实feign使用了spring cloud loadbanlancer作为负载均衡器。 可以通过修改provider的端口,再在本地启动一个新的provider服务,那么本地有2个provider 服务,端口分别为8760和8762。在浏览器上多次调用http://localhost:8763/hi-feign,浏览器会交替显示:
hello feign, i'm provider ,my port:8762
hello feign, i'm provider ,my port:8760
4.使用nacos作为配置中心
Nacos除了可以作为服务注册中心,它还有服务配置中心的功能。类似于consul config,Nacos 是支持热加载的。配置中心和注册中心的依赖包是不同的,注册中心的依赖包是 nacos discovery,而配置中心的依赖包是 nacos config,它的具体如下。
4.1 工程案例
在工程的pom文件引入nacos-config的Spring cloud依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-config</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring-cloud服务模块必须依赖,否则无法启动 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>4.0.2</version>
</dependency>
<!-- nacos配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2022.0.0.0-RC1</version>
</dependency>
在bootstrap.yml
(一定是bootstrap.yml文件,不是application.yml文件)文件配置以下内容:
spring:
application:
name: nacos-config
cloud:
nacos:
config:
server-addr: 172.19.112.2:8848
file-extension: yaml
prefix: nacos-config
profiles:
active: dev
在上面的配置中,配置了nacos config server的地址,配置的扩展名是ymal(目前仅支持ymal和properties)。注意是没有配置server.port的,sever.port的属性在nacos中配置。上面的配置是和Nacos中的dataId
的格式是对应的,nacos的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profile.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档。- 注意:当
spring.profile.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成
${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
启动nacos,创建一个data id :nacos-config-dev.yaml
,完整的配置为:
server:
port: 8761
nacosvar: jupiter-nacos-config-dev
写一个RestController,在Controller上添加 @RefreshScope 实现配置的热加载。代码如下:
@RestController
@RefreshScope
public class ConfigController {
@Value("${nacosvar:null}")
private String nacosvar;
@RequestMapping("/nacosvar")
public String get() {
return "nacosvar="+nacosvar;
}
}
启动工程nacos-config,在浏览器上访问localhost:8761/nacosvar:
5.OpenFeign
TODO
参考资料
- 【狂神说Java】SpringCloud笔记(5万字保姆级笔记)_一只小逸白的博客-CSDN博客
- SpringCloud从入门到精通(超详细文档一)_cuiqwei的博客-CSDN博客
- SpringCloud 2020版本教程1:使用nacos作为注册中心和配置中心 - 方志朋的博客 (fangzhipeng.com)
- 一文快速上手 Nacos 注册中心+配置中心!-阿里云开发者社区 (aliyun.com)
- spring cloud alibaba springboot nacos 版本对应_FH-Admin的博客-CSDN博客
- Nacos Spring Boot 快速开始
- springboot3.0集成nacos2.2.1(一)_nacos和springboot版本对应_魔锋剑上缺的博客-CSDN博客
评论 (0)