目录
1、了解微服务
1、微服务的由来
2、为什么需要微服务
4、微服务本质
5、什么样的项目适合微服务
6、微服务开发框架
2、微服务实现Eureka
1、创建普通springboot项目
2、创建子模块
3、使用Eureka注册中心
4、创建消费者
3.网关
1、什么是网关
2、API 网关的职能
3、Gateway是什么
4、在idea中如何实现
4.nacos
1、什么是nacos
2、如何进入nacos
3、新建nacos
4、后端使用nacos
1、在启动类上添加注解
2、在application.properties文件中添加配置
3、编写测试类
4、启动服务测试
1、了解微服务
(1)微服务就是一种架构风格
(2)微服务就是把一个项目拆分成独立的多个服务,并且多个服务是可以独立运行的,而每个服务都会占用线程。
1、微服务的由来
微服务最早由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。
2、为什么需要微服务
简单举例:看军事新闻的同学应该都知道,一艘航空母舰作战能力虽然很强,但是弱点太明显,就是防御能力太差,单艘的航空母舰很少单独行动,通常航空母舰战斗群才是主要军事力量,你可以把单艘航母理解为的单体应用(防御差,机动性不好),把航母战斗群(调度复杂,维护费用高)理解为微服务。
大部分的开发者经历和开发过单体应用,无论是传统的 Servlet + JSP,还是 SSM,还是现在的 SpringBoot,它们都是单体应用,那么长期陪伴我们的单体应用有什么弊端?我们是面临了什么问题,导致我们要抛弃单体应用转向微服务架构?个人总结主要问题如下:
- 部署成本高(无论是修改1行代码,还是10行代码,都要全量替换)
- 改动影响大,风险高(不论代码改动多小,成本都相同)
- 因为成本高,风险高,所以导致部署频率低(无法快速交付客户需求)
当然还有例如无法满足快速扩容,弹性伸缩,无法适应云环境特性等问题,但我们不一一详谈了,以上的问题,都是微服务架构要解决的问题,至于具体是怎么解决的,我们先放到后面再聊
3、微服务与单体架构区别
单体架构(monolithic structure):顾名思义,整个项目中所有功能模块都在一个工程中开发;项目部署时需要对所有模块一起编译、打包;项目的架构设计、开发模式都非常简单。
单体架构的优点:
- 架构简单
- 开发测试部署简单
单体架构的缺点:
当项目规模较小时,这种模式上手快,部署、运维也都很方便,因此早期很多小型项目都采用这种模式。
但随着项目的业务规模越来越大,团队开发人员也不断增加,单体架构就呈现出越来越多的问题:
-
团队协作成本高:试想一下,你们团队数十个人同时协作开发同一个项目,由于所有模块都在一个项目中,不同模块的代码之间物理边界越来越模糊。最终要把功能合并到一个分支,你绝对会陷入到解决冲突的泥潭之中。
-
系统发布效率低:任何模块变更都需要发布整个系统,而系统发布过程中需要多个模块之间制约较多,需要对比各种文件,任何一处出现问题都会导致发布失败,往往一次发布需要数十分钟甚至数小时。
-
系统可用性差:单体架构各个功能模块是作为一个服务部署,相互之间会互相影响,一些热点功能会耗尽系统资源,导致其它服务低可用。
4、微服务本质
微服务架构,首先是服务化,就是将单体架构中的功能模块从单体应用中拆分出来,独立部署为多个服务。同时要满足下面的一些特点:
-
单一职责:一个微服务负责一部分业务功能,并且其核心数据不依赖于其它模块。
-
团队自治:每个微服务都有自己独立的开发、测试、发布、运维人员,团队人员规模不超过10人(2张披萨能喂饱)
-
服务自治:每个微服务都独立打包部署,访问自己独立的数据库。并且要做好服务隔离,避免对其它服务产生影响
5、什么样的项目适合微服务
微服务可以按照业务功能本身的独立性来划分,如果系统提供的业务是非常底层的,如:操作系统内核、存储系统、网络系统、数据库系统等等,这类系统都偏底层,功能和功能之间有着紧密的配合关系,如果强制拆分为较小的服务单元,会让集成工作量急剧上升,并且这种人为的切割无法带来业务上的真正的隔离,所以无法做到独立部署和运行,也就不适合做成微服务了。
6、微服务开发框架
目前微服务的开发框架,最常用的有以下四个:
Spring Cloud:http://projects.spring.io/spring-cloud(现在非常流行的微服务架构)
Dubbo:http://dubbo.io
Dropwizard:http://www.dropwizard.io (关注单个微服务的开发)
Consul、etcd&etc.(微服务的模块)
2、微服务实现Eureka
1、创建普通springboot项目
下面所有使用的都是idea软件,如果没有可以去官网下载安装
idea下载
创建springboot项目
创建即可
把除了pom.xml和.idea以外的全部删除
然后再建一个子模块,并且也是空项目,这个空项目就包含我们本次演示的所有代码,下一次演示时再单独创建一个子模块来承装
2、创建子模块
直接创建一个Module
还是老样子,只需要更改两个即可
只需要一个Spring Web即可,无需勾选其他的
这是创建成功的效果,多了一个模块
现在在他的pom.xml文件下添加依赖
完整pom.xml文件如下h
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>cloud-register</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>11</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><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.0.0</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId><version>3.0.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId></exclude></excludes></configuration></plugin></plugins></build></project>
还可以创建多个子模块,但这里就不一一展示,我们直接对cloud-register进行操作
3、使用Eureka注册中心
在application.properties文件中加入以下配置
server.port=8001
#eureka服务端的实例名称
eureka.instance.hostname=localhost
#false表示不向注册中心注册自己。
#eureka.client.register-with-eureka=false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
#eureka.client.fetch-registry=false
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
spring.application.name=eureka
eureka.client.service-url.defaultZone=http://localhost:8001/eureka/
在启动类添加以下注解
@EnableEurekaServer
添加完成后就可以开始启动了,如果无误,则可以直接在浏览器输入
localhost:8001
在本机中查找8001的端口号,就可以进入以下页面
而在上面括号的地方,也就是注册的用户
4、创建消费者
依然是上面相同的配置
导入新的依赖
整体依赖如下
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>cloud-register</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>11</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><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.0.0</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><version>3.0.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId></exclude></excludes></configuration></plugin></plugins></build></project>
application.properties文件如下:
server.port=8081
spring.application.name=goods-service#eureka
#true表示向注册中心注册自己。
eureka.client.register-with-eureka=true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
eureka.client.fetch-registry=true
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
eureka.client.service-url.defaultZone=http://localhost:8001/eureka
启动类中添加这个注解
@EnableEurekaClient
最后就可以启动了,如果无误,可以刷新localhost:8001页面
可以看到,此时多了一个注册的用户,代表我们的用户注册成功了
3.网关
1、什么是网关
简单来说就是服务调用的入口,在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平 台无关的服务协议作为各个单元间的通讯方式。
2、API 网关的职能
-
请求接入,作为所有API接口服务请求的接入点
-
业务聚合,作为所有后端业务服务的集合点
-
中介策略,实现安全校验,过滤,路由,控流等
3、Gateway是什么
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
4、在idea中如何实现
这里可以先创建一个多模块的微服务,可以查看这个博主的教程,写的很好
【idea版】springcloud微服务(1)之多模块版本新建一个springcloud项目_idea 微服务新建子服务-CSDN博客
但这里我是使用我自己的
创建了一个hm-gateway的子模块
在这里引入网关的依赖
<!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
新建一个配置文件:application.yaml
可以看到,这就是我们实现网关的核心配置代码
下方的default-filters则是网关的默认过滤器
server:port: 8080
spring:application:name: gatewaycloud:nacos:server-addr: 192.168.87.99:8848gateway:routes:- id: itemuri: lb://item-servicepredicates:- Path=/items/**,/search/**- id: carturi: lb://cart-servicepredicates:- Path=/carts/**- id: useruri: lb://user-servicepredicates:- Path=/users/**,/addresses/**- id: tradeuri: lb://trade-servicepredicates:- Path=/orders/**- id: payuri: lb://pay-servicepredicates:- Path=/pay-orders/**default-filters:- AddRequestHeader=truth, anyone long-press like button will be rich- PrintAny=1,2,3
id:就是唯一值,可以随便写,确保唯一就行
uri:就是你的请求需要转发后的地址
predicates:断言,就是满足条件,满足就转发到uri
现在如果我使用网关的端口也就是8080去访问上面的这些路径,能不能成功的访问呢?
此时就可以看到,虽然使用的是8080的端口,也就是hm-gateway的端口访问
但是仍然访问成功了,所以说在这里我们的网关就实现成功了,其他功能可以正常访问了
4.nacos
nacos官网
1、什么是nacos
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
2、如何进入nacos
在nacos地址这里可以下载naco下载完之后,将他复制到一个无中文名称的路径包下
例如我这种,全是英文的路径
点击地址栏,输入cmd,打开命令控制器
startup.cmd -m standalone
输入上面这段指令,可以开启nacos
如果出现这种问题,代表jdk版本与它所支持的不匹配
所以说我们现在有两种解决方案
- 更换jdk
- 更改配置,适应自己的jdk
为了方便,那当然是更改配置,这样简单一点
找到这个文件,右键使用记事本打开
找到这一行,我们要在这中间添加一条代码
直接将这条代码添加上去。注:双引号的位置是你jdk的安装位置
set JAVA_HOME="你的jdk位置"
配置完成后,我们再次执行startup.cmd -m standalone,就可以进来了
如果看到这个,代表我们启动成功了
此时打开浏览器,在地址栏输入这条
http://localhost:8848/nacos/
输入完成后就可以进入这个页面了
这就表示我们成功的进入到nacos中了
3、新建nacos
我们可以直接点击上方的创建配置 ,然后就会进入到我们可以创建的地方
了解以下几点后,我们就可以开始进行创建了
我在这边简单添加了一个小美以及她的信息
4、后端使用nacos
这时候就可以打开后端了
在pom.xml文件中添加以下依赖
<!-- SpringCloud Ailibaba Nacos Config -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
这代表这我们引入了nacos的依赖
1、在启动类上添加注解
@EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient//开启nacos注解@MapperScan(basePackages = "com.cyy.product.mapper")
public class ProductApplication {public static void main(String[] args) {SpringApplication.run(ProductApplication.class,args);}
}
2、在application.properties文件中添加配置
spring.profiles.active=dev
spring.application.name=cloud-producer-server
server.port=8080# nacos 配置中心地址
spring.cloud.nacos.config.server-addr=localhost:8848
# 配置文件的类型
spring.cloud.nacos.config.file-extension=yaml
3、编写测试类
//配置发布之后,动态刷新配置
@RefreshScope
@RestController
@RequestMapping("provider")
public class ProviderController
{// 使用原生注解@Value()导入配置@Value("${user.id}")private String id;@Value("${user.name}")private String name;@Value("${user.age}")private String age;@GetMapping("getNacosConfig")public String providerTest(){return "我是provider,已成功获取nacos配置中心的数据:(id:" + id + ",name:" + name + ",age:" + age +")";}
}
4、启动服务测试
启动项目可以看到 nacos 配置中心的配置信息已经生效并被成功获取到了
这样一个nacos的简单配置就完成了
如果想了解更加深入的nacos知识,可以查看以下博主
Nacos学习圣经:从入门到精通 Nacos,最全详解_spring 集成nacos 2.3入门到精通-CSDN博客