自己有服务器如何架设网站/企业网站制作步骤
目录
服务架构演变
单体架构
分布式架构
分布式架构需要考虑的问题
微服务
架构比较
微服务技术对比
服务拆分注意事项
案例
服务远程调用
RestTemplate
Eureka注册中心
RestTemplate存在的问题
服务调用考虑的问题
Eureka的作用
搭建EurekaServer
服务注册
服务发现
Ribbon负载均衡
负载均衡流程
负载均衡策略更改
Ribbon加载方式
微服务开发,实现充分解耦
服务架构演变
单体架构
将业务的所有功能集中在一个项目中开发,打成一个包部署
优点:架构简单、部署成本低
缺点:耦合度高
分布式架构
根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,成为一个服务
优点:降低服务耦合、有利于服务升级拓展
缺点:成本上升,需要搭建集群等
分布式架构需要考虑的问题
- 服务拆分粒度如何
- 服务集群地址如何维护
- 服务之间如何实现远程调用
- 服务健康状态如何感知
微服务
微服务是一种经过良好架构设计的分布式架构方案。
微服务架构特征:
- 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
- 面向服务:微服务对外暴露业务接口
- 自治:团队独立、技术独立、数据独立、部署独立
- 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
架构比较
微服务技术对比
服务拆分注意事项
- 不同微服务,不要重复开发相同业务
- 微服务数据独立,不要访问其它微服务的数据库
- 微服务可以将自己的业务暴露为接口,供其它微服务调用
案例
数据准备,两个数据库中分别有一个表
创建项目
demo链接:https://pan.baidu.com/s/19DcTpkvCdHixQaLCiAYbBw?pwd=zmbw
服务远程调用
RestTemplate
有一种远程调用方式为A模块访问B模块的某个方法url地址,然后B模块返回结果给A模块。
现在我们需要实现一个查询订单的功能,这里需要订单模块像用户模块发起一个查询用户的请求。发起请求我们可以采用RestTemplate来实现
首先在Order的引导类中将RestTemplate加载为Bean
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients(basePackages = "com.zmt.clients")
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}
在OrderService中使用RestTemplate
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);//利用RestTemplate查询String url="http://localhost:8081/user/"+order.getUserId();//发送请求,得到JSON对象,如果给定需要转化的对象,则会转换为Java对象User user = restTemplate.getForObject(url, User.class);order.setUser(user);// 4.返回return order;}
}
Eureka注册中心
RestTemplate存在的问题
采用硬编码的方式去调用服务。不符合分布式中集群的使用场景。
服务调用考虑的问题
- 服务消费者该如何获取服务提供者的地址信息?
- 如果有多个服务提供者,消费者该如何选择?
- 消费者如何得知服务提供者的健康状态?
Eureka的作用
当服务器启动后,会主动将自己的信息注册到Eureka-server中,当一个服务器需要远程调用另一个服务器中心方法时,需要从Eureka-server中拉去对应的地址信息,如果存在多个地址,则采用负载均衡的策略调用对应服务器。存活的服务器每三十秒向Eureka-server中发送一次心跳,当Eureka-server超过30秒没有接收到心跳,则会将对应的地址从注册中心中剔除。防止其他服务器调用到对应地址服务器。
搭建EurekaServer
新建一个Maven项目,并配置如下依赖
<parent><artifactId>cloud-demo</artifactId><groupId>cn.itcast.demo</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.zmt</groupId><artifactId>eureka-serve</artifactId><dependencies><!-- Eureka服务 --><dependency><groupId>org.springframework.cloud</groupId><!-- 特别容易导错文件,启动报错一定检查pom是否导入正确 --><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies>
编写启动类,并添加注解
@SpringBootApplication
@EnableEurekaServer//开启Eureka服务
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class,args);}
}
添加配置文件
server:port: 8082
spring:application:name: eureka-serve # 服务名称eureka:client:register-with-eureka: true #false 标识不向注册中心注册自己fetch-registry: false # false 表示自己就是注册中心,维护服务实例即可,不需要去检索服务service-url: # eureka的地址信息defaultZone: http://127.0.0.1:8082/eureka/
随后启动服务
点击进入Eureka界面
服务注册
现在将用户模块与订单模块注册到Eureka-Server中,需要引入Eureka-Client依赖,并添加配置文件
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
spring:application:name: xxx-server
eureka:client:service-url:defaultZone: http://127.0.0.1:8082/eureka/
之后启动服务观察Eureka页面
此时实例数都分别为1,现在测试集群下的实例,一个模块启动多个服务。具体操作如下
启动后观察
服务发现
在RestTemplate加载为Bean的方法上添加@LocdBalanced注解(意为负载均衡策略),用服务提供者的服务名进行远程调用。
@Bean
@LoadBalanced//负载均衡策略
public RestTemplate restTemplate(){return new RestTemplate();
}
public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);//将具体的地址修改为服务名称String url="http://user-server/user/"+order.getUserId();//发送请求,得到JSON对象,如果给定需要转化的对象,则会转换为Java对象User user = restTemplate.getForObject(url, User.class);order.setUser(user);// 4.返回return order;}
访问地址观察结果
Ribbon负载均衡
负载均衡流程
使用RestTemplate访问服务名的地址实际上并不是真实的url地址,通过Ribbon将格式转化,从eureka-server中拉去需要转化的信息,然后返回服务列表由Ribbon来决定使用哪个地址
发现服务后,具体如何请求到对应的服务器上,接下来看源码分析
getServer()方法去做具体均衡策略
点击进去观察
进入chooseServer()方法观察
rule中存在如下几个实现类来决定如何实现分配
消费者通过服务者提供的服务名进行远程调用时,请求被Ribbon负载均衡所拦截,Ribbon去eureka-server拉取生产者的信息,eureka-server返回服务列表给Ribbon,由Ribbon选择访问哪个服务器具体拦截方式,通过RestTemplate上面的@LocdBalanced注解拦截,拦截通过RestTemplate发送的请求
负载均衡策略更改
1、全局更改(该消费者无论访问哪个服务都使用该策略)
在消费者的启动类下加入IRule的Bean(即,重写默认的IRule),return一个需要的负载均衡策略对象。
2、针对某一生产者的修改
在application.yml中配置生产者的服务名以及负载均衡策略。
user-server: #生产者服务名称ribbon:NFLoadBalancerRuleClassName: com.netflix.Loadbalancer.RandomRule #选择负载均衡策略
Ribbon加载方式
Ribbon默认采用懒加载方式。也就是用到的时候才会进行加载,这就决定了,第一次访问时,耗时会长一些。也可以在配置文件中选择饥饿加载。具体配置如下
ribbon:eager-load:enabled: true #开启饥饿加载clients:- user-server- xxx-server
相关文章:

SpringCloud之Eureka的学习【详细】
目录 服务架构演变 单体架构 分布式架构 分布式架构需要考虑的问题 微服务 架构比较 微服务技术对比 服务拆分注意事项 案例 服务远程调用 RestTemplate Eureka注册中心 RestTemplate存在的问题 服务调用考虑的问题 Eureka的作用 搭建EurekaServer 服务注册 …...

学习ftp
文章目录 一、FTP介绍二、两种模式(主动模式和被动模式)三、FTP配置文件详解四、实际场景举例五、黑白名单六、网络限制 一、FTP介绍 1.FTP(File Transfer Protocol)是一种应用广泛且古老的互联网文件传输协议。 2.主要应用于互联…...

Android笔记(九):Compose组件的状态(一)
在使用Compose定义UI界面时,可以发现界面的变换往往与Compose组件内部的状态相关,当状态值发生变化时,Compose构成的可组合的界面也会刷新发生相应的变化。将在本笔记中将对可组合项的状态的定义、状态提升、状态丢失和状态的保存进行简单介绍…...

3.2. onnx export multi_batch
前言 将onnx bs=1 修改为多batch操作 参考链接: https://www.cnblogs.com/tangjunjun/p/16500116.html https://blog.csdn.net/weixin_43863869/article/details/128638397?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault…...

探索低代码PaaS平台的优势与选择原因
PaaS是一种云产品,它为应用程序的开发和部署提供基础结构。它提供中间件、开发工具和人工智能来创建功能强大的应用程序,大多数PaaS服务都与存储和网络基础架构捆绑在一起,就像基础架构即服务(IaaS)一样,可…...

AD教程(一)工程组成及创建
AD教程(一)工程组成及创建 工程组成 原理图库 绘制电阻模型、芯片模型、电容模型等,即将元件模型绘制出来。 原理图 将绘制的原件模型放置到原理图中,然后再添加连接的导线、网络标号。器件和器件之间的连接关系,在原…...

SAP业务从ECC升级到SAP S/4HANA有哪些变化?有哪些功能得到增强?
SAP在2015年推出了新一代商务套件SAP S/4 HANA。 SAP S/4 HANA (全称SAP Business suite 4 SAP HANA),这款新产品完全构建于目前先进的内存平台SAP HANA 之上,同时采用现代设计理念,通过SAP Fiori 提供精彩的用户体验 (UX)。提供比ECC更强大的功能。S/4h…...

常用conda和pip命令总结
conda 环境相关命令 conda 新建环境命令 conda create -n env_name pythonx.xenv_name 是环境名,自己换成所要创建的虚拟环境的名字 pythonx.x 是版本号,比如3.7,3.8这样 查看conda环境下所有的虚拟环境 conda info -e conda env list两条…...

【计算机网络】路由器的工作原理
文章目录 输入端口处理和基于目的地转发交换结构输出端口处理排队问题参考资料 路由器的四个组件 输入端口(input port):执行物理层功能(input port 左边方框、output port 右边方框)、数据链路层功能(input/output port 中间方框…...

队列概念|循环队列的实现
前言 今天我们将学习循环队列实现,我们首先介绍队列的概念和结构,之后一步步讲解循环队列由来与实现。 一、队列的概念与结构 1、队列的概念 队列: 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列是…...

监控数据控中的数据表
背景: 在做一个项目的时候,每次代码分析的数据会写入到数据库,目前想实现当数据插入到数据库后,对新插入的数据进行监控解析。当有一个新纪录插入到数据表的时候,数据库可以自动解析新插入的数据记录。 思路如下&…...

进程替换..
1、单进程版 – 最简单的先看看程序替换 现象就是 1、我们用自己的进程封装了内置指令ls,并且代码中execl 后 printf 的after并没有打印出来。 2、谈进程替换的原理 单进程替换基本原理 上面例子中execl的做法非常简单粗暴,要调用ls,那么就把mycom…...

M1安装OpenPLC Editor
下载OpenPLC Editor for macOS.zip文件后,使用tar -zvxf命令解压,然后将"OpenPLC Editor"拖入到"应用程序"文件夹 右键点击"OpenPLC Editor",打开这个""文件,替换为以下内容 #!/bin/bash…...

STM32F10xx 存储器和总线架构
一、系统架构 在小容量、中容量和大容量产品 中,主系统由以下部分构成: 四个驱动单元 : Cotex-M3内核、DCode总线(D-bus)和系统总线(S-bus) 通用DMA1和通用DMA2 四个被动单元 内部SRAM 内部…...

并发编程
什么是并发编程? 并行:在同一个时间节点上,多个线程同时执行(是真正意义上的同时执行) 并发:一个时间段内,多个线程依次执行。 并发编程:在例如买票、抢购、秒杀等等场景下,有大量的请求访问…...

Lauterbach使用指南之RunTime功能
Lauterbach使用指南之RunTime功能 前言 首先,请问大家几个小小问题,你清楚: Lauterbach这个工具是干什么用的吗?在软件运行过程中如何测量两个运行point之间的runtime时间呢?Lauterbach的RunTime功能具体应当如何来操…...

GaussDB数据库管理系统介绍
1.GaussDB的发展 2.GaussDB的生态 内部: 云化自动化方案。通过数据库运行基础设施的云化将DBA(数据库管理员)和运维人员的日常工作 自动化。外部: 采用与数据库周边生态伙伴对接与认证的生态连接融合方案,解决开发者/DBA难获取、应用难对接等…...

使用docker部署lnmp多站点
1. 创建一个 Docker 网络 以便容器可以在同一网络上进行通信 docker network create lnmpnetwork2. 运行 MySQL 容器: 运行 MySQL 容器并将其连接到创建的网络。确保将 MySQL 的端口映射到宿主机上,以便您可以从宿主机访问数据库。 将mysql的配置和数…...

实例详解:Java使用JWT和Redis实现高效单点登录(SSO)
前言 单点登录(Single Sign-On,简称SSO)是一种身份验证和访问控制机制,允许用户使用一组凭证(如登录名和密码)登录到多个应用程序中,而无需为每个应用程序单独进行身份验证。用户只需要登录一次…...

SQL中使用ROLLUP和CUBE函数轻松生成汇总行
在数据分析和报表制作中,通常需要对数据进行汇总和分组,我们常用的就是GROUP BY汇总数据,当我们想按照不同维度汇总时,往往需要编写多个GROUP BY预计,而借助ROLLUP 和 CUBE 函数可以一次性生成子总计和总计行ÿ…...

CentOS 7 安装和配置java环境
1 安装包准备 安装包可以通过下面地址进行版本选择安装: https://www.oracle.com/java/technologies/downloads/#java8 2 正式开始安装 本次分享的安装方法直接通过编辑/etc/profile文件实现java的安装 2.1 新建安装包存放目录 mkdir /java cd /java/ 2.2 解压安…...

「实验记录」CS144 Lab0 networking warmup
文章目录 一、Motivation二、SolutionsS1 - Writing webgetS2 - An in-memory reliable byte stream 三、Results四、Source 一、Motivation 第一个小测试 webget 是想让我们体验并模拟一下在浏览器中键入 URL 后获得远程服务器传来的内容,这并没有太大的难度&…...

html5怎么实现语音搜索
html5怎么实现语音搜索 谷歌的网站在他们首页发现了HTML5的新玩法——语音搜索。 注意: 只有webkit核心的浏览器才能使用 用法很简单 只需要在input添加属性x-webkit-speech即可,例子如下: 代码如下: <input type"text" x-…...

吴恩达《机器学习》1-2:什么是机器学习?
一、什么是机器学习? Arthur Samuel(1959): 他定义机器学习为,在进行特定编程的情况下,给予计算机学习能力的领域。 Tom Mitchell(1998): 他定义的机器学习是,…...

基于STC系列单片机实现定时器扫描数码管显示定时器/计数器产生频率的功能
#define uchar unsigned char//自定义无符号字符型为uchar #define uint unsigned int//自定义无符号整数型为uint #define NixieTubeSegmentCode P0//自定义数码管段码为单片机P0组引脚 #define NixieTubeBitCode P2//自定义数码管位码为单片机P2组引脚 sbit LED P1^0;//位定义…...

Linux环境开发工具yum、makefile的使用 【Linux】
文章目录 Linux软件包管理器 - yumLinux下安装软件的方式yum查找软件包如何实现本地机器和云服务器之间的文件互传卸载软件Linux编译器 - gcc/g 程序的翻译过程1.预编译(预处理)2.编译(生成汇编)3.汇编(生成机器可识别…...

第六章(6):Python中的函数—闭包和装饰器
1.闭包 在Python中,闭包是指函数与其相关的自由变量的一个整体。当一个函数返回了一个内部函数时,这个内部函数可以访问其定义所在的外部函数中的变量,即使这个外部函数已经返回了。这种特性就叫做闭包。 代码示意: def funca():x = 250def funcb():print(我仍然可以访问…...

Linux--安装与配置虚拟机及虚拟机服务器坏境配置与连接---超详细教学
一,操作系统介绍 1.1.什么是操作系统 操作系统(Operating System,简称OS)是一种系统软件,它是计算机硬件和应用软件之间的桥梁。它管理计算机的硬件和软件资源,为应用程序提供接口和服务,并协调…...

基于SSM的个性化美食推荐系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...

Django 全局配置 settings 详解
文章目录 1 概述1.1 Django 目录结构 2 常用配置:settings.py2.1 注册 APP:INSTALLED_APPS2.2 模板路径:TEMPLATES2.3 静态文件:STATICFILES_DIRS2.4 数据库:DATABASES2.5 允许访问的主机:ALLOWED_HOSTS 1 …...