Spring Cloud知识点全总结(四)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Spring Cloud知识点全总结

执行后的效果如图,并且不会报错:


83bb963ade884ffabd1fa0bdf3c5c3b8.png


(4)访问


在浏览器输入地址:http://127.0.0.1:8848/nacos即可访问:


8aeaa24b21154f0bbfe418b5dfd9e53a.png


默认的账号和密码都是nacos,进入后:


2e7a8333217b4be5a79797f087d06aa1.png


这里就成功进入到我们nacos的控制台了!


3.Linux下安装Nacos


Linux或者Mac安装方式与Windows类似。


(1)上传安装包,随便用什么方式上传上去, 但是要记住上传.tar.gz的那个包。


(2)移动到Linux服务器的某个目录,例如/usr/local/src目录下


(3)解压


命令解压缩安装包:


tar -xvf nacos-server-2.1.0.tar.gz


然后删除安装包:


rm -rf nacos-server-2.1.0.tar.gz


4. 服务注册到nacos


下面我们就可以用Nacos来完成服务注册和服务发现了。


不管是Eureka也好,还是Nacos也好,只要是做服务注册和服务发现,都会遵循Spring Cloud Commons的一些通用接口。那么,我们在使用Eureka或者Nacos时,我们的服务提供者和服务消费者的代码是不用做任何变化的。要改变的东西是我们要引用的依赖,以前是Eureka的依赖,现在该引用Nacos的依赖了。第二呢就是服务地址,以前我们的服务地址配的是Eureka的地址,现在改成配Nacos的地址就可以了。


总结一下就是:

Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册、服务发现规范。因此使用Nacos和使用Eureka对于微服务来说,并没有太大区别。


主要差异在于:


依赖不同

服务地址不同

(1)引入依赖


在cloud-demo父工程的pom文件中的<dependencyManagement>中添加SpringCloudAlibaba的依赖:


<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>


然后在user-service和order-service中的pom文件中分别引入nacos-discovery依赖:


<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>


注意:不要忘了注释掉eureka的依赖。

(2)配置nacos地址

在user-service和order-service的application.yml中添加nacos地址:


spring:
  cloud:
    nacos:
      server-addr: localhost:8848


这里也不要忘记把之前Eureka的配置删除掉

更改后的yml分别如下:


server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    username: root
    password: zc20020106
    driver-class-name: com.mysql.cj.jdbc.Driver
  application: #服务的名称
    name: userservice
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
mybatis:
  type-aliases-package: com.haiexijun.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    com.haiexijun: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
    username: root
    password: zc20020106
    driver-class-name: com.mysql.cj.jdbc.Driver
  application: #服务的名称
    name: orderservice
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
mybatis:
  type-aliases-package: com.haiexijun.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    com.haiexijun: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS


(3)重启所有服务


打开nacos的控制台,可以查看到服务列表了。


35f0dcef604c48599d1b0124a25dc1cb.png


我们点开详情,会有更详细的服务信息:


5d64324a729b441b94e224d3a8929351.png


5. 服务分级存储模型


你光听名字是不是觉得服务分级存储模型很高级啊,但其实我们已经接触过这样的分级概念了。


之前,我们有服务的概念,我们提供用户查询的user-service,还有提供订单查询的order-service,他们都叫服务。然后我们user-service还部署了多个实例。所以,我们之前是分有两层概念的,第一层是服务,而第二层是实例,一个服务可以包含多个实例。


不过啊,随着我们的业务规模越来越大,那么我们就会考虑更多的问题了。比如说,我们现在我们把所以的实例都部署在一个机房,就像你把鸡蛋放在一个篮子里,要是哪一天,不小心篮子翻了,蛋不就全打了吗?那你的机房要是天灾人祸出了问题,那整个服务不久完了吗?


所以,为了解决这个问题,我们会将一个服务的多个实例部署到多个机房。特别像阿里和京东这种财大气粗的,我全国各地都整些机房。一个倒了,还有其他的在正常运行。这就叫容灾。


而我们的Nacos服务分级存储模型,就是引入了类似机房的概念或者地域的概念。他把同在一个机房的多个实例称为一个集群。比方说杭州的某一个服务的机房的所有实例就称杭州的集群,北京机房的服务实例就称为北京的集群。


eaefae894edd4dc3b7ff8a6cbafd5f68.png


所以在nacos的服务分级存储模型中,一级是服务,往下是集群,再往下是实例。


那为什么Nacos要引入这样的服务分级的模型呢?我原来直接用服务找实例不好吗?


我们设想有这样一种情况,比方说我有一个杭州的机房,里面有order-service的集群和user-service的集群,然后我还有一个上海的机房,也是一样的配置,将来还可能会有北京机房等等。现在我们的order-service想要访问user-service,他有两种选择,一种是在自己本地访问,一种是去局域网外访问,你觉得它该选哪一个啊?肯定选本地啊!我们局域网内的访问距离比较短,速度就比较快,延迟也就比较低。而你跨越了集群的访问,比如说你从杭州去请求广州,达到了数百公里,这个时候延迟是非常高的。所以,在服务调用时应该尽可能地去访问本地集群,只有在本地集群不可用的情况下,才去访问其他的集群。


我们现在还没有配置集群,我们进入nacos的控制台,点开一个服务的详情:


a009b0265a9545608be3241f4290bbb5.png


会发现它的集群为DEFAULT ,也就是说没有配置集群。


下面就来学习一下如何配置一个服务的集群。


6.配置服务集群属性


我们有3个userservice服务,假如我们想要前两个user服务的集群放到上海集群,最后一个user服务放到杭州集群。来模拟一下这种跨集群部署的方式。


修改user-service的application.yml文件,添加集群配置:


spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称


编写好配置文件后,我们先启动前面的两个服务实例:


f0c347b363fe41fe848b9eb940faabe7.png


然后我们要配置第三个实例的集群,我们再修改yml配置文件:


spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: SH # 集群名称


然后再启动最后一个服务(前两个服务不要关掉):


4837aa369204464b8dac7c6e65bc6048.png


或者在服务配置里面配置集群:


ed55b9e58d124ea8a19edc1d41dfc880.png


我们再次打开Nacos的控制台,然后点击用户服务的详情:


7b6548cfa36740eeae1615cfe536527e.png


还没有完,我们最终想要实现的是order-service远程调用user-service时,优先选择本地集群。因此,我们还需要给order-service也配置一个集群属性。


下面回到idea,为order-service也设置一下集群属性。我们配置为杭州HZ,然后重启order-service。


7.NacosRule负载均衡


我们清空日志后,在浏览器访问order服务获取三个订单数据,然后回到idea的控制台看日志。会发现8081,8082,8083端口的三个服务都被访问了。


812ecae9ca6f482a9361f16186d34397.png

52115439bec4474f990bc8c427127845.png

17783baf263c49999d1f2133fc3c3e2f.png


我们发现,order-service发起远程调用的时候居然没有选择同集群的8081和8082。它仍然采用的是轮询方案,这又是什么原因啊?


我们知道,服务在选择一个实例时,全都是由负载均衡的规则来决定的。我们现在没有配置,默认的就是轮询的规则。所以要想实现优先同集群访问的负载均衡规则,我们必须去修改负载均衡。


默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。


(1) 给order-service配置集群信息(上一节配好了,就可以不用配了)


userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 


(2) 修改负载均衡规则


修改order-service的application.yml文件,修改负载均衡规则:


userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 


然后,我们重新启动一下order-service服务,然后在浏览器里多访问几次订单查询。


3b007253e0bb4041ba9f5022d8db99b2.png

0d00763c94674a35ae78dd9f03ca061e.png

07ed8e1a691e481885b37e74de7535c1.png


我们发现只有8081和8082的控制台才有日志,而8083的控制台没有日志。这说明我们已经实现了Nacos同集群优先的负载均衡。


我们还会发现Nacos的一个特点就是它在8081和8082并不是轮询,是随机的。


也就是说,Nacos规则优先选择本地集群,在集群内,随机选择不同的服务实例进行负载均衡。


我们在来演示一下跨集群的访问吧,在idea里面把8081和8082的两个HZ集群的服务全部关闭,然后Nacos控制台会显示健康的实例数只有一个了。然后我们浏览器访问订单服务。


会发现8083的日志出现了,并且order-service服务也有调用远程集群的提示日志,这证明order-service进行了跨集群的访问。


60805d67eb26479fb92df22f3b45a6f2.png

5333e78e6c02408f856d8f1fb0391f8b.png


8.服务实例的权重设置


实际部署中会出现这样的场景:


服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。


但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。


在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:


5163131476484482a5c6fb772d9be734.png


在弹出的编辑窗口,修改权重:


0b567ec1f803448fb0a6d3959508b244.png


我们把8081实例的权重值设置为 0.1 ,理论上讲8081被访问到的概率就会是8082的十分之一了。


注意:如果权重修改为0,则该实例永远不会被访问


把实例的权重调成0时,这个实例就压根不会被访问,那这有啥作用呢?


在我们以前,一个服务我们想要对他做一个版本的升级,我们是不是要把它重启啊,但是你光天化日之下你去重启一个服务,你好意思吗?用户都还在访问呢,你一重启客户都访问不上了,这样做就有问题啊。所以说我们不能随便去重启的。


我们有了权重之后,我们是不是可以这么做呢?假设我们有多个服务器8081、8082、8083(这里假设一下),我先把8081的服务的权重调成0,这个时候8081就不接收用户请求了。此时我对这台服务器做停机,用户就不会有感知了。我们就可以对8081进行一些版本的升级,升级完成之后,我再重启,并且权重我也先不调太大,先放少数用户进来测试看看行不行,如果没有问题,我们就可以依次扩大比例,依次都升级。用户是无感知的,这可以做到平滑升级,非常优雅。


9.环境隔离


Nacos提供了namespace来实现环境隔离功能。


我们知道Nacos是一个注册中心,它还是一个数据中心。所以在Nacos里面,它为了去做数据和服务的管理,会有一个环境隔离的概念。


Nacos中服务存储和数据存储的最外层都是一个namespace的东西,用来做最外层隔离。


nacos中可以有多个namespace

namespace下可以有group、service等

不同namespace之间相互隔离,例如不同namespace的服务互相不可见


0715c4b73ec048dfb8863592aa869165.png


有人可能会问,我们既然把服务实例划分成了集群,怎么要再整一个隔离呢?服务划分和实例划分是基于业务去做的划分,但事实上我们会有开发环境、测试环境、生产环境的变化吧。所以我们会基于这种环境变化去做隔离,namespace就是来做这样一件事情的。


而至于Group是分组的意思,把一些业务相关度比较高的服务放到一个组。假设你的订单服务和支付服务业务相关度比较高,那你就可以把它们放到一个Group里面去。


所以这是概念上的一个划分,他不是要求你必须得用这个来划分,你可以选择来用namespace或group,这不是强制的。


下面就来演示一下Nacos的使用。


10.创建namespace环境隔离


默认情况下,所有service、data、group都在同一个namespace,名为public:


ba4b0f03d3444a4ebd00f293db602b57.png


我们点击命名空间栏后,右上角可以点击新建命名空间:


52a36903df924b4ca061edd769cc9f55.png


我们可以点击页面新增按钮,添加一个namespace:


9dea29f27fa349b9a9e4535d0e17289d.png


然后,填写表单:


6a165787aec9420aae466b02bf8a1f33.png


然后点击确定。然后切换到服务列表:


766b4c88bf974f02aa4334502669349b.png


11.给微服务配置namespace


给微服务配置namespace只能通过修改配置来实现。


例如,修改order-service的application.yml文件:


spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: b4401444-96e0-4b9a-a58b-9b24b74bfdfd # 命名空间,填ID
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
监控 Java 应用服务中间件
Spring Boot 源码面试知识点
【5月更文挑战第12天】Spring Boot 是一个强大且广泛使用的框架,旨在简化 Spring 应用程序的开发过程。深入了解 Spring Boot 的源码,有助于开发者更好地使用和定制这个框架。以下是一些关键的知识点:
16 6
|
3天前
|
监控 安全 Java
Spring cloud原理详解
Spring cloud原理详解
15 0
|
6天前
|
监控 Java 数据库连接
总结Spring Boot面试知识点
Spring Boot是一个基于Spring框架的开源项目,它简化了Spring应用的初始搭建以及开发过程。通过提供“约定优于配置”的方式,Spring Boot可以帮助开发者快速构建出生产级别的Spring应用。
14 0
|
7天前
|
消息中间件 负载均衡 Java
【Spring Cloud 初探幽】
【Spring Cloud 初探幽】
15 1
|
9天前
|
Java 开发者 微服务
Spring Cloud原理详解
【5月更文挑战第4天】Spring Cloud是Spring生态系统中的微服务框架,包含配置管理、服务发现、断路器、API网关等工具,简化分布式系统开发。核心组件如Eureka(服务发现)、Config Server(配置中心)、Ribbon(负载均衡)、Hystrix(断路器)、Zuul(API网关)等。本文讨论了Spring Cloud的基本概念、核心组件、常见问题及解决策略,并提供代码示例,帮助开发者更好地理解和实践微服务架构。此外,还涵盖了服务通信方式、安全性、性能优化、自动化部署、服务网格和无服务器架构的融合等话题,揭示了微服务架构的未来趋势。
32 6
|
13天前
|
JSON Java Apache
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
|
14天前
|
负载均衡 Java 开发者
Spring Cloud:一文读懂其原理与架构
Spring Cloud 是一套微服务解决方案,它整合了Netflix公司的多个开源框架,简化了分布式系统开发。Spring Cloud 提供了服务注册与发现、配置中心、消息总线、负载均衡、熔断机制等工具,让开发者可以快速地构建一些常见的微服务架构。
|
15天前
|
消息中间件 Java RocketMQ
Spring Cloud RocketMQ:构建可靠消息驱动的微服务架构
【4月更文挑战第28天】消息队列在微服务架构中扮演着至关重要的角色,能够实现服务之间的解耦、异步通信以及数据分发。Spring Cloud RocketMQ作为Apache RocketMQ的Spring Cloud集成,为微服务架构提供了可靠的消息传输机制。
28 1
|
15天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo: 微服务通信的高效解决方案
【4月更文挑战第28天】在微服务架构的发展中,服务间的高效通信至关重要。Spring Cloud Dubbo 提供了一种基于 RPC 的通信方式,使得服务间的调用就像本地方法调用一样简单。本篇博客将探讨 Spring Cloud Dubbo 的核心概念,并通过具体实例展示其在项目中的实战应用。
16 2