什么是微服务、微服务如何实现Eureka,网关是什么,nacos是什么

news/2024/12/26 16:31:09/

目录

1、了解微服务

1、微服务的由来

2、为什么需要微服务

3、微服务与单体架构区别

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博客


http://www.ppmy.cn/news/1558308.html

相关文章

排序算法 (插入,选择,冒泡,希尔,快速,归并,堆排序)

排序:经常在算法题中作为一个前置操作,为了之后的贪心or else做个铺垫,虽然我们经常都只是调用个sort,但是了解一些排序算法可以扩充下知识库 排序的分类: 从存储设备角度&#xff1a; ✓ 内排序&#xff1a;在排序过程中所有数据元素都在内存中&#xff1b; ✓ 外排序&a…

hive常用函数有哪些

Hive是一个基于Hadoop的数据仓库工具&#xff0c;它提供了类似于SQL的接口&#xff0c;用于数据查询和分析。Hive提供了许多内置函数&#xff0c;这些函数可以分为几种类型&#xff0c;包括&#xff1a; • 字符串函数&#xff1a;用于处理字符串数据。 • concat()&#xff1…

记录一个SVR学习

1、为什么使用jupter来做数据预测&#xff1f;而不是传统pycharm编辑器 1、Jupyter Notebook 通过anaconda统一管理环境&#xff0c;可以运行python、R、Sql等数据分析常用语言。 2、做到交互式运行&#xff0c;可以逐步运行代码块&#xff0c;实时查看结果&#xff0c;便于调…

webpakc介绍

介绍 因为不确定打出的前端包所访问的后端IP&#xff0c;需要对项目中IP配置文件单独拿出来&#xff0c;方便运维部署的时候对IP做修改。 因此&#xff0c;需要用webpack单独打包指定文件。 CommonsChunkPlugin module.exports {entry: {app: APP_FILE // 入口文件},outpu…

Python实现机器学习驱动的智能医疗预测模型系统的示例代码框架

以下是一个使用Python实现机器学习驱动的智能医疗预测模型系统的示例代码框架。这个框架涵盖了数据收集&#xff08;爬虫&#xff09;、数据清洗和预处理、模型构建&#xff08;决策树和神经网络&#xff09;以及模型评估的主要步骤。 1. 数据收集&#xff08;爬虫&#xff09…

解决 Docker 中 DataLoader 多进程错误:共享内存不足

一、问题描述&#xff1a; 在容器化环境&#xff08;如 Docker&#xff09;中使用深度学习框架进行训练时&#xff0c;通常会使用 PyTorch 的 DataLoader 来加载数据。在使用 DataLoader 的多进程数据加载时&#xff0c;当 num_workers > 0&#xff0c;即启用多个工作进程并…

记录使用uim4的自定义头部

很离谱查官网 查啦官网和文档是在app.ts中定义headerRender就可以的 但是就是不行 结果需要一下操作 哥们 这破外应整两个小时 也是醉啦 return {logo: https://img.alicdn.com/tfs/TB1YHEpwUT1gK0jSZFhXXaAtVXa-28-27.svg,menu: {locale: false,},layout:mix,// loading:true,…

数据分析时的json to excel 转换的好用小工具

有时候获取很大的 json 内容&#xff0c; 在网页的免费转换工具中因为数据太大不让转换如下 我们可以使用简单的 python 进行转换方便阅读 import pandas as pddata {address1: 969 West Wen Yi Road, address2: Yu Hang District, city: Hangzhou, zip: 311121, country: Ch…