1.微服务简介
1.1概念
单体应用:基于idea/eclipse,maven等创建一个工程,然后基于SpringBoot,spring,mybatis框架进行整合,接下来再写一堆dao、mapper、service、controller,再加上一些的配置文件,有可能还会引入redis、elasticsearch、mq等其它项目的依赖,开发好之后再将项目打包成一个jar包/war包。其实质是一个体量较小的服务类型
微服务架构:微服务架构(MSA)的基础是将单个应用程序开发为一组小型独立服务,这些独立服务在自己的进程中运行,独立开发和部署。这些服务使用轻量级 API 通过明确定义的接口进行通信,并且相互独立,每项服务执行一项功能,可以针对各项服务进行更新、部署和扩展,以满足对应用程序特定功能的需求。
程序中的微服务,就是将各个业务系统的共性再进行抽取,做成独立的服务,如图所示:
1.2 单个组件
说明:当个组件中有许多的字符接口链,而通过这些接口链,最终完成了整个服务的架构
同时也完成单个1组件的一些基本业务。
1.3SpringCloud 微服务解决方案
1.3.1Netflix 解决方案(了解)
对于微服务架构,几乎所有的大公司走的都是自研路线。例如,国内最初的典型代表最早都是基于阿里的Dubbo进行实现,后来国外的netflix公司将他们内部的微服务技术架构进行了开源,在互联网行业产生了很大的影响力,然后接着就被整合到了spring社区,变成了spring cloud项目。
其架构图如下:
说明:在现阶段SpringCloud netflix公司的这套微服务解决方案,官方的很多组件,现在已经不提供维护了
1.3.2 Alibaba 解决方案(掌握)
概述:Spring Cloud Alibaba 是Spring Cloud的一个子项目,致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
核心组件分析
Spring Cloud Alibaba 默认提供了如下核心功能(先了解):
- 服务限流降级:默认支持 WebServlet、OpenFeign、RestTemplate、Spring Cloud Gateway, RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
- 服务注册与发现:基于Spring Cloud 服务注册与发现标准,借助Nacos进行实现,默认还集成了 Ribbon 的支持。
- 分布式配置管理:基于Nacos支持分布式系统中的外部化配置,配置更改时自动刷新。
- 消息驱动能力:基于Spring Cloud Stream 为微服务应用构建消息驱动能力。
- 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
- 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker上执行。
解决方案架构设计
基于Spring Cloud Alibaba实现的微服务,解决方案设计架构如图所示:
2.SpringCloud环境编译
2.1项目创建
2.1.1 创将新项目,配置新仓库
settings--Bulid--maven--localrepositiory 再新建一个仓库,以免仓库重复
2.1.2.设置编译格式
编译配置:
设置字符格式
配置喜好设置
2.1.3.项目结构
2.1.4 创建聚合父工程
1.创建工程,删除src
2.添加核心依赖以及管理
<dependencyManagement>
<dependencies>
<!--Spring boot 依赖(定义了微服务规范)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<!--Spring Cloud 依赖(定义了微服务规范)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<!--Spring Cloud Alibaba依赖(基于spring微服务规范做了具体落地实现)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
3.进行nacos测试
3.nacos介绍
3.1简介及安装
Nacos(DynamicNaming and Configuration Service)是一个应用于服务注册与发现、配置管理的平台。它孵化于阿里巴巴,成长于十年双十一的洪峰考验,沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。其官网地址如下:
https://nacos.io/zh-cn/docs/quick-start.html
构建Nacos服务
1.下载:https://github.com/alibaba/nacos/releases
2.选择版本 nacos-sercer-1.4.1 zip
3.解压直接使用
3.2初始化配置以及使用
1.找到/conf/nacos-mysql.sql文件里的sql脚本构建数据库:source sql文件路径
2.打开/conf/application.properties,修改默认配置
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root
3.启动Nacos服务:startup.cmd -m standalone
4,访问Nacos服务:
打开浏览器,输入http://localhost:8848/nacos地址,出现如下登陆页面:
其中,默认账号密码为nacos/nacos.
3.3生产者服务创建及注册
1.创建服务提供者工程(module名为sca-provider),继承parent工程(01-sca)
pom.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>01-sca</artifactId>
<groupId>com.cy.jt</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sca-provider</artifactId>
<dependencies>
<!--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>
</dependency>
</dependencies>
</project>
2.创建并修改配置文件application.yml(或者application.properties),实现服务注册
server:
port: 8081
spring:
application:
name: sca-provider
cloud:
nacos:
server-addr: localhost:8848
3.创建启动类,并定义处理请求的控制层对象和方法,
package com.cy;
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ScaProviderApplication.class, args);
}
@Value("${server.port}")
private String server;
@RestController
public class ProviderController {
@GetMapping(value = "/provider/echo/{msg}")
public String doEcho(@PathVariable String msg) {
return server+"say:Hello Nacos Discovery " + msg;
}
}
}
4.启动启动类,然后刷先nacos服务,检测是否服务注册成功。
3.4 消费者服务发现及调用
创建服务消费者(module名为sca-consumer),继承parent工程(01-sca)
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>01-sca</artifactId>
<groupId>com.cy.jt</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sca-consumer</artifactId>
<dependencies>
<!--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>
</dependency>
</dependencies>
</project>
2.修改配置文件application.yml
server:
port: 8090
spring:
application:
name: sca-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848 #从哪里去查找服务
3.创建启动类并实现服务消费
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@RestController
public class ProviderConsumer {
@Value("${spring.application.name}")
private String appName;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/doRestEcho1")
public String doRestEcho01(){
String url = "http://localhost:8081/provider/echo/"+appName;
System.out.println("request url:"+url);
return restTemplate.getForObject(url, String.class);
}
}
4.启动消费者服务,并在浏览器输入http://localhost:8090/consumer/doRestEcho1,网页显示如图
总结:在nacos中启动对应的提供者服务和消费者服务,均会在nacos中启动一个健康实例,而通过nacos平台,我们可以方便的获取和管理这些容器。