SpringCloud下的微服务应用技术(认识篇)

一. 导学

微服务是分布式架构的一种,就是把服务做拆分。传统单体架构代码容易耦合,大型互联网项目要拆分。把一个独立的项目成为服务,最后形成服务集群,一个业务可能需要用到多个服务。

注册中心(拉取或注册服务信息),用以记录服务的IP和端口等服务,服务前往注册中心寻找另外一个服务。

配置中心(拉取配置信息),统一管理整个服务集群的配置文件,实现配置热更新。

服务网关负责对用户身份做校验,并作为请求路由,进行负载均衡。

由于数据库较少,用户数量庞大,还要进行分布式缓存分布式搜索

使用消息队列进行异步通信,可以提高并发性能。

微服务概览

学习路线按类可以分为五部分,分别是微服务治理、缓存技术、搜索技术、异步通信技术和DevOps。

二. 认识微服务

单体架构:将业务所有功能集中在一个项目中开发,打成一个包部署。优点是架构简单,部署成本低。缺点是耦合度较高。

分布式架构:根据业务功能对系统进行拆分,每个业务模块独立开发,称为一个服务。优点是耦合度降低,利于服务升级拓展。但是要考虑的问题也会增多:

  1. 服务拆分粒度?
  2. 服务集群地址如何维护?
  3. 服务之间如何实现远程调用?
  4. 服务健康状态如何感知?

微服务是一种经过良好架构设计的分布式架构方案,其特征为(高内聚、低耦合):

  1. 单一职责:服务拆分粒度更小,每个服务对应一个业务能力,避免重复开发
  2. 面向服务:对外暴露业务接口
  3. 自治:团队独立、技术独立、数据独立、部署独立
  4. 隔离性强:隔离、容错、降级,避免出现级联问题

微服务方案需要技术框架落地,知名的框架包括SpringCloud和阿里巴巴Dubbo。

SpringCloudAlibaba提供Dubbo+SpringCloud的接口规范支持。

微服务技术栈对比

远程调用

我们希望通过发起HTTP请求调用另一个服务的RestFul Api接口。

  1. 注册RestTemplate

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}// 注册@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
  1. 在业务中进行远程调用

    @Service
    public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);// 2.利用RestTemplate发起HTTP请求,查询用户String url = "http://localhost:8081/user/" + order.getUserId();User user = restTemplate.getForObject(url, User.class);// 3.封装user到orderorder.setUser(user);// 4.返回return order;}
    }

三. Eureka注册中心

提供者与消费者

服务提供者:被其他微服务调用的服务

服务消费者:调用其他微服务的服务

一个服务既可以是提供者,也可以是消费者。

总体流程

Eureka作用

Eureka搭建

第一步:引入依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

 

第二步:启动类加注解 @EnableEurekaServer

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}
}

 

第三步:配置文件application.yml

server:port: 10086 # 服务端口
spring:application:name: eurekaserver # 服务名称
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka # eureka地址信息

 

Eureka服务注册

与上述过程类似,引依赖、配地址和服务名称,要注意依赖选择client,如下所示:

XML

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

 

在IDEA中,对已运行的服务右键->Copy Configuration,在VM options中指定新的端口号,例如-Dserver.port=8082,可以将原来的服务复制一份,部署后查看Eureka的注册中心情况。

Eureka注册情况

服务发现

在前面的例子中,orderservice要调用userservice服务,因此我们在orderservice中引入eureka-client的依赖,并且修改请求URL:

String url = "http://userservice/user/" + order.getUserId();

 

然后在启动类中RestTemplate上加@LoadBalanced注解实现负载均衡。

Spring会自动根据服务名为userservice的实例列表,进行负载均衡并请求。

四. Ribbon负载均衡

过程

找到LoadBalancerInterceptor.class,跟踪代码,可以找到RibbonLoadBalancerClient.class。

Ribbon负载均衡

可以看到,里面是先拿到allServerList,里面包含了被调用微服务userservice的服务列表,包括IP地址和端口号。

继续跟踪代码,会发现后续之行了一个名为chooseServer的函数,里面调用了Irule接口的实例。

在IDEA中,光标选中Irule接口,然后按快捷键Ctrl+H,就可以看到它的实现。里面的规则包括RoundRobin(轮询)和Random(随机)等。在这次跟踪中,最后发现其采用的是ZoneAvoidanceRule。

Irule实现

总体流程如下图:

Ribbon负载均衡总体流程

规则

上面说到有不同的rule(规则),不同规则的含义如下所示。

内置负载均衡规则类规则描述
RoundRobinRule简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。
AvailabilityFilteringRule对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的..ActiveConnectionsLimit属性进行配置。
WeightedResponseTimeRule为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
ZoneAvoidanceRule以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
BestAvailableRule忽略那些短路的服务器,并选择并发数较低的服务器。
RandomRule随机选择一个可用的服务器。
RetryRule重试机制的选择逻辑

自定义规则

方案一(全局):在启动类或配置类中注入Irule即可,例如:

@Bean
public IRule randomRule(){return new RandomRule(); // 将负载均衡设置为随机
}

 

方案二(局部):在orderservice的application.yml中配置:

YML

userservice: # 针对某个微服务配置负载均衡规则,这里是userservice服务ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 规则为随机

 

饥饿加载

Ribbon默认懒加载,即第一次访问才去创建LoadBalanceClient。开启饥饿加载,可以在项目启动时就创建,降低第一次的访问耗时。

在上面的例子中,不开启饥饿加载的情况下,第一次访问加载大约要500ms。

开启后,响应时间降到250ms左右,快了一半,但仍比第二次访问的30ms慢很多,这是因为第一次还要加载DispatcherServlet等。

开启饥饿加载需要配置application.yml:

YML

ribbon:eager-load:enabled: trueclients: - userservice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/286020.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01.数据归档工具的选择-Percona Toolkit,并centos7.9中安装

1.需求 1.1.在实际的业务使用过程中&#xff0c;我们既要考虑服务器硬件的成本&#xff0c;也要考虑系统的稳定性。所以就有了数据归档的这个业务需求了。我们需要把一些老的数据&#xff0c;比如两年前的数据移出去。增强数据库的性能。 1.2.在进行数据归档的过程中&#xf…

代码随想录day28(1)二叉树:二叉搜索树中的插入操作(leetcode701)

题目要求&#xff1a;给定二叉搜索树&#xff08;BST&#xff09;的根节点和要插入树中的值&#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证&#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 思路&#xff1a;对于二叉搜索树来说&…

计算机网络:分层体系结构

计算机网络&#xff1a;分层体系结构 基本分层概述各层次的任务物理层数据链路层网络层运输层应用层 数据传递过程分层体系常见概念实体协议服务 基本分层概述 为了使不同体系结构的计算机网络都能互联&#xff0c;国际标准化组织于 1977 年成立了专门机构研究该问题。不久他们…

力扣HOT100 - 283. 移动零

解题思路&#xff1a; 双指针 指针 i 用于寻找不为零的位置 指针 j 用于寻找为零的位置 不为零时&#xff0c;自己与自己交换&#xff0c;i 和 j 同时向下一个位置移动 为零时&#xff0c;nums[ i ]与nums[ j ]交换&#xff0c;使零向后移动 class Solution {public void…

【c++】类和对象(三)构造函数和析构函数

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章我们带来类和对象重要的部分&#xff0c;构造函数和析构函数 目录 1.类的6个默认成员函数2.构造函数2.1构造函数其他特性 3.构析函数3.1特性&#xff1a;…

Alibaba spring cloud Dubbo使用(基于Zookeeper或者基于Nacos+泛化调用完整代码一键启动)

Quick Start Dubbo&#xff01;用更优雅的方式来实现RPC调用吧 - 掘金 dubbozookeeper demo 项目结构&#xff1a; RpcService 仅仅是提供服务的接口&#xff1a; public interface HelloService {String sayHello(String name); }DubboServer pom&#xff1a; <?xm…

【机器学习】基于变色龙算法优化的BP神经网络分类预测(SSA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】变色龙优化算法&#xff08;CSA)原理及实现 2.设计与实现 数据集&#xff1a; 数据集样本总数2000 多输入多输出&#xff1a;样本特征24&#xff…

excel所有知识点

1要加双引号 工作表&#xff08;.xlsx) 单击右键→插入&#xff0c;删除&#xff0c;移动、重命名、复制、设置标签颜色&#xff0c;选定全部工作表 工作表的移动&#xff1a;两个表打开→右键→移动&#xff08;如果右键是灰色的&#xff0c;可能是保护工作表了&#xff09…

unbantu Apache的基本配置与配置静态资源访问

目录 前言: 1.Apache介绍 2.安装Apache 3. 测试Apache服务是否启动成功 3.1配置Servername 3.2重启服务 4.配置Apache主页面 5. 配置静态的资源 6.为静态资源设置访问权限(基于源地址) 致谢: 前言: 此博客是基于unbantu的Apache服务的详细解析&#xff0c;在这片博…

荟萃分析R Meta-Analyses 1

参考&#xff1a;Harrer, M.、Cuijpers, P.、Furukawa, TA 和 Ebert, DD (2021)。 使用 R 进行荟萃分析&#xff1a;实践指南。佛罗里达州博卡拉顿和伦敦&#xff1a;Chapman & Hall/CRC Press。 ISBN 978-0-367-61007-4。 1.1什么是荟萃分析&#xff1f; 它的创始人之一 G…

Spring IoC DI(1)

IoC & DI入门 Spring 通过前面的学习, 我们知道了Spring是一个开源框架, 它让我们的开发更加简单. 它支持广泛的应用场景, 有着活跃且庞大的社区, 这就是Spring能够长久不衰的原因. 但是这个概念还是比较抽象. 可以用更具体的话描述Spring, 那就是: Spring是包含了众多…

Scikit-Learn逻辑回归(二)

Scikit-Learn逻辑回归二:多项式与正则化 1、多项式回归回顾1.1、为什么使用多项式1.2、多项式回归及原理2、逻辑回归使用多项式2.1、逻辑回归中使用多项式2.2、逻辑回归使用多项式案例(鸢尾花分类)3、逻辑回归使用正则化3.1、正则化回顾3.2、逻辑回归中使用正则化1、多项式回…

【Git】第二课:git安装和配置

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

中国历史上著名的9大阳谋

阳谋这个词最早出自毛主席&#xff0c;是指随势而发、光明正大地利用计策&#xff0c;达到自己的目的&#xff0c;就算别人识破这个计谋&#xff0c;也无计可施&#xff0c;就算对方已经看出这是个陷进&#xff0c;也不得不跳进去。 那么阳谋和阴谋有什么区别呢&#xff1f;阴…

CMakeLists生成动态库.so和静态库.a

一、下载NDK CMake - NDK : 26.2.11394342 或 23.1.7779620 - CMake : 3.22.1 二、新建android\app\CMakeLists.txt 文件CMakeLists.txt内容 cmake_minimum_required(VERSION 3.4.1) #mker为项目名称 project(mker)#设置生成的so动态库最后输出的路径 set(CMAKE_LIBRARY_OUTP…

使用uniapp 的 plus.sqlite 操作本地数据库报错:::table xxx has no column named xxxx

背景&#xff1a; 1、使用uniapp 的 plus.sqlite 进行APP本地数据库操作 2、SQLite 模块用于操作本地数据库文件&#xff0c;可实现数据库文件的创建&#xff0c;执行SQL语句等功能。 遇到&#xff1a;在之前创建的表上进行新增字段的操作时候&#xff0c;出现问题&#xff1a…

API 接口渗透测试

1 API 接口介绍 1.1 RPC&#xff08;远程过程调用&#xff09; 远程过程调用&#xff08;英语&#xff1a;Remote Procedure Call&#xff0c;缩写为 RPC&#xff09;是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序&#xff0c;而程序员无…

css的active事件在手机端不生效的解决方法

需求&#xff1a;需求就是实现点击图中的 “抽奖” 按钮&#xff0c;实现一个按钮Q弹的放大缩小动画 上面是实现的效果&#xff0c;pc端&#xff0c;点击触发 :active 问题&#xff1a;但是这种方式在模拟器上可以&#xff0c;真机H5一调试就没生效了&#xff0c;下面是简单…

力扣438. 找到字符串中所有字母异位词

Problem: 438. 找到字符串中所有字母异位词 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.编写辅助函数bool same(vector& need, vector& matched)&#xff1a; 1.1 以need为标准&#xff0c;循环对比need和matched的每一个位置的元素值是否相等 2.获…

redis实际应用场景及并发问题的解决

业务场景 接下来要模拟的业务场景: 每当被普通攻击的时候&#xff0c;有千分之三的概率掉落金币&#xff0c;每回合最多爆出两个金币。 1.每个回合只有15秒。 2.每次普通攻击的时间间隔是0.5s 3.这个服务是一个集群&#xff08;这个要求暂时不实现&#xff09; 编写接口&…