SpringCloudAlibaba微服务实战系列(一)Nacos服务注册发现

SpringCloudAlibaba微服务实战系列(一)Nacos服务注册发现

实战前先做一个背景了解。

单体架构、SOA和微服务

单体架构:近几年技术的飞速发展,各种各样的服务已经进入到网络化。单体架构发布时只需要打成一个war或jar包发布即可;而随着业务量激增或网站流量的增加,必会暴露致命缺陷。

SOA:Service Oriented Architecture 面向服务的体系结构。旨在提升代码复用性及扩展性,降低耦合等。 如一个外卖流程,分配送餐是一个服务,短信通知也是一个服务。这些服务独立部署,通过网络互相调用(HTTP等方式),形成完整的服务系统。

微服务:微服务是由多个功能单一的小服务组成的,服务可以根据业务进行拆分;这些服务独立部署;不同的服务可以采用不同的技术(不同的变成语言或数据库等);服务之间采用HTTP等轻量协议进行交互传输数据,可看成是更细粒度的SOA架构。

微服务优缺点

优点:

  • 代码复杂度低:根据业务细粒度划分,业务功能明确清晰,体积小,便于理解和维护
  • 技术选型不被限制:单个服务可根据自身的业务选择不同的语言和技术栈实现
  • 独立部署:部署的影响范围小
  • 服务可伸缩性:某些服务的承载量大时,可多部署几个节点负载,承载量小时,可减少几个节点节省服务器资源
  • 错误隔离:多服务中,一个服务的宕机不会影响整个系统的运行
  • 分库更容易:不同服务连接不同的数据库

缺点:

  • 架构系统复杂:不是简单的服务调用,要充分考虑网络延迟和故障带来的影响,必要时可能需要采用消息中间件
  • 服务依赖:如A服务调B,然后B调C,当C服务变更时,B和A都需要进行改动
  • 数据一致性问题:典型的分布式事务的问题
  • 接口排错困难:多个服务时,需要同时查看它们的log日志
  • 部署和运维:检查和监控多个服务的健康状态,快速部署、根据服务负载进行服务动态伸缩都是不小的挑战

SpringCloud技术栈

那为了更好的管理微服务,SpringCloud技术诞生了。常用技术栈实现:

技术栈技术栈落地实现
服务注册和发现Eureka、Zookeeper、Consul、Nacos
熔断、降级、限流Hystrix、Sentinel
服务调用Ribbon、LoadBalancer、Feign、OpenFeign、Dubbo
配置Config、Zookeeper、Consul、Nacos
网关Zuul、Gateway
消息总线Bus、Nacos

以上的技术实现方案有SpringCloudNetflix的也有SpringCloudAlibaba的。此系列我们只使用Alibaba的。

以下技术栈:

  • Nacos:做配置和服务注册发现
  • RocketMQ:阿里的分布式消息中间件,提供可靠的消息发布和订阅
  • Sentinel:做服务限流、降级、熔断功能
  • Seata:解决分布式事务问题(保证数据的一致性)

开始实战

环境

在实战前先确保我们的开发环境:

  • java8
  • maven
  • IDEA工具
  • mysql 5.7及以上

注意:IDEA中如果和Maven的版本不匹配会报错,Unable to import maven project,自己调整下版本吧

SpringBoot起步

在创建一个项目时,首先要注意的就是和SpringCloud和Alibaba的版本是否兼容,看一下SpringBoot和cloud的版本兼容

在这里插入图片描述

到spring官网或者阿里云的网页创建项目都可以。先创建一个项目导入到IDEA中吧

在这里插入图片描述

导入后将SpringBoot版本改为2.6.11的即可

然后再创建子module(服务者和消费者),在父工程主要做版本依赖管理:

<properties>
   <java.version>8</java.version>
   <boot.version>2.6.11</boot.version>
   <cloud.version>2021.0.4</cloud.version>
   <cloud.alibaba.version>2021.0.4.0</cloud.alibaba.version>
</properties>

<dependencyManagement>
    <dependencies>
        <!--springboot依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--cloud的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--cloud.alibaba依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${cloud.alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
   <plugins>
      <!--指定Maven的插件,和编译的jdk版本,若不指定maven3默认使用jdk1.5-->
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>3.7.0</version>
         <configuration>
            <source>1.8</source>   <!--源代码使用的jdk版本-->
            <target>1.8</target>   <!--编译后生成的class文件的版本-->
            <encoding>UTF-8</encoding> <!--字符编码集-->
         </configuration>
      </plugin>
   </plugins>
</build>

nacos的安装和配置

注意:nacos需要依赖jdk环境,必须是1.8及以上的版本

nacos的下载页面:https://github.com/alibaba/nacos/releases

在这里插入图片描述

瞅好对应的版本关系下载即可。

下载完毕后,cmd命令窗口启动即可。

注:如果下载的时2.2.1及以上版本的,nacos把默认的密钥给设置为空了,需要我们手动给添加上,然后在启动

在nacos的配置文件application.properties中

nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789

启动nacos

startup.cmd -m standalone

启动完成后,登录nacos的网址看下http://localhost:8848/nacos,默认的用户名和密码都是nacos。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8JFqOEqA-1690075432821)(../imgs1/5.png)]

简单集成nacos

创建三个子工程,分别是provider8001provicer-8002consumer9001,然后注册进入nacos后,通过Ribbon实现远程调用。

工程结构如图,3个工程都引入健康监控和nacos的服务注册发现

在这里插入图片描述

以consumer项目为例的配置文件

server:
  port: 8001
spring:
  application:
    name: provider # 应用名

  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos服务地址

图例:

在这里插入图片描述

启动类及注解:

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

启动三个项目查看nacos服务页的变化。
在这里插入图片描述

服务已经注册,且provider的实例是两个,莫得问题~

采用RestTemplate+Ribbon实现简单远程调用

服务提供者提供接口(两个提供者都写上)

@RestController // @RestController注解是@Controller+@ResponseBody
public class TestController {
    @Value("${server.port}")
    private String port; // 获取配置文件中写的程序端口号
    @RequestMapping("/test") // 标记是该方法的请求
    public String test() {
        return "hello world test " + port;  // 返回值是一个字符串,因为用了@RestController所以不必额外加@ResponseBody了
    }
}

消费者还需要引入loadbalancer的依赖,高版本中需要自己手动引入

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

服务消费者采用JavaConfig的方式将配置类做好,代码如下:

@Configuration
public class GenericConfiguration { // 常规配置类
    @LoadBalanced // 标注此注解后,RestTemplate就具有了客户端负载均衡能力
    @Bean
    public RestTemplate restTemplate(){ // 创建RestTemplate,并交个Spring容器管理
        return new RestTemplate();
    }
}

消费者调用接口

@RestController
public class TestController {

    private final String SERVER_URL = "http://provider"; // 这里的服务地址填写注册到Nacos的应用名称
    @Resource
    private RestTemplate restTemplate;
    @RequestMapping("/test")  // 标记是该方法的请求
    public String test() {
        return restTemplate.getForObject(SERVER_URL + "/test", String.class);//调用提供者/test接口
    }

}

启动项目测试调用执行:

curl localhost:9001/test

在这里插入图片描述

可看到远程调用以及简单的负载实现效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年的深度学习入门指南(19) - LLaMA 2源码解析

2023年的深度学习入门指南(19) - LLaMA 2源码解析 上一节我们学习了LLaMA 2的补全和聊天两种API的使用方法。本节我们来看看LLaMA 2的源码。 补全函数text_completion源码解析 上一节我们讲了LLaMA 2的编程方法。我们来复习一下&#xff1a; generator Llama.build(ckpt_di…

设计模式 - 工厂模式

一、 简单工厂&#xff08;Simple Factory Pattern&#xff09; 1、概念 一个工厂对象决定创建出哪一种产品类的实力&#xff0c;但不属于GOF23种设计模式。 简单工厂适用于工厂类负责创建的对象较少的场景&#xff0c;且客户端只需要传入工厂类的参数&#xff0c;对于如何创…

fastadmin采坑之接口分页处理

其实不算fastadmin的代码而是thinkphp自带的分页代码 paginate函数就是自带的分页函数&#xff0c;开始我以为这个只能用于渲染模板不能用于接口&#xff0c;后面看到源代码发现请求参数带page就可以 /*** ApiTitle (获取协会会员)* ApiSummary (获取协会会员)* ApiMethod …

Java在线OJ项目(一)、多进程编程实现 做题代码的编译和运行

在线OJ项目&#xff08;一&#xff09;、多进程编程实现 做题代码的编译和运行 一、回顾线程和进程二、进程比线程的优势三、多进程编程样例四、多进程思想 实现对代码 的编译 以及 运行两个功能CommandUtil 由于我们是在线oj&#xff0c;所以得编译用户的代码不仅编译 还需要 …

[ELK使用篇]:SpringCloud整合ELK服务

文章目录 一&#xff1a;前置准备-(参考之前博客)&#xff1a;1.1&#xff1a;准备Elasticsearch和Kibana环境&#xff1a;1.1.1&#xff1a;地址&#xff1a;[https://blog.csdn.net/Abraxs/article/details/128517777](https://blog.csdn.net/Abraxs/article/details/1285177…

云服务器远程nacos服务注册失败/不健康Client not connected, current status:STARTING

文章目录 Nacos报错docker安装不用 docker安装 Nacos报错 docker安装 使用docker在云服务器安装Nacos之后出现Client not connected, current status:STARTING 使用docker 安装之后需要添加映射端口 docker run -e JAVA_OPTS"-Xms256m -Xmx256m"-e MODEstandalone…

领导需求不好接?给你一份“化危为机的自救指南”

领导高瞻远瞩&#xff0c;落地成难&#xff0c;问题&#xff1a;领导常常是急性发挥&#xff0c;时间稍微久一点就思路就模糊了&#xff0c;后续怎么做都不对。 遇到这种情况的小伙伴&#xff0c;公屏打上“pua”。 这种情况下&#xff0c;给出自救指南&#xff1a; 1、引导交…

深度学习——批标准化Batch Normalization

什么是批标准化&#xff1f; 批标准化&#xff08;Batch Normalization&#xff09;是深度学习中常用的一种技术&#xff0c;旨在加速神经网络的训练过程并提高模型的收敛速度。 批标准化通过在神经网络的每一层中对输入数据进行标准化来实现。具体而言&#xff0c;对于每个输…

vue3+elementplus后台管理系统,实现侧边栏菜单显示到主内容区域

目录 1 创建页面2 设置路由3 修改首页4 首页的完整代码总结 我们已经使用vue3和elmentplus初步搭建了首页&#xff0c;上一篇中有个问题没解决&#xff0c;就是在侧边栏导航功能里&#xff0c;如果点击菜单希望是在首页打开页面而不是跳转到新页面。以下是我们希望实现的效果 这…

AI学习笔记二:YOLOV5环境搭建及测试全过程

若该文为原创文章&#xff0c;转载请注明原文出处。 记录yolov5从环境搭建到测试全过程。 一、运行环境 1、系统&#xff1a;windows10 &#xff08;无cpu) 2、yolov5版本&#xff1a;yolov5-5.0 3、python版本&#xff1a;py3.8 在创建虚拟环境前需要先把miniconda3和py…

GUI自动化测试进阶:页面对象模式

本文介绍的是页面对象设计模式及其常见的滥用继承的错误。 本文和语言无关&#xff0c;但作者主要使用python和java。本文假设读者已经具有了一定的python或java基础&#xff0c;知道类和方法是什么。 如果完全没有这方面的基础&#xff0c;请看我的《测试人员如何学Python》。…

【图像分类】基于LIME的CNN 图像分类研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 基于LIME&#xff08;Local Interpretable Model-Agnostic Explanations&#xff09;的CNN图像分类研究是一种用于解释CNN模型的方法。LIME是一…

【UE5 多人联机教程】04-加入游戏

效果 步骤 1. 新建一个控件蓝图&#xff0c;父类为“USC_Button_Standard” 控件蓝图命名为“UMG_Item_Room”&#xff0c;用于表示每一个搜索到的房间的界面 打开“UMG_Item_Room”&#xff0c;在图表中新建一个变量&#xff0c;命名为“Session” 变量类型为“蓝图会话结果…

自恢复保险丝(PPTC)的金属材料说明

保险丝大家都是知道的&#xff0c;但保险丝当中的自恢复保险丝&#xff08;PPTC&#xff09;可能就不太了解的。 其实PPTC自恢复保险丝与大家所认识的保险丝一样&#xff0c;都是起到限流作用&#xff0c;达到电路防护效果。简单来说就是一旦电路中的电流超过所规定的电流时&am…

【数据结构】二叉树详解(3)

⭐️ 前言 ✨ 往期链接&#xff1a;【数据结构】二叉树详解(1) 在第一篇二叉树文章中&#xff0c;我们探讨了二叉树的链式结构定义与实现。二叉的遍历包含( 前序/中序/后序遍历 )及代码实现和递归流程图的详细讲解。还有一些二叉树的其他接口定义与实现&#xff0c;包含 Binar…

【vue3】vue3的一般项目结构、成功显示自己的vue3页面

一、vue3的一般项目结构 Vue 3并没有规定特定的项目结构&#xff0c;因此您可以根据项目的需求和个人偏好来组织您的Vue 3项目。以下是一个常见的Vue 3项目结构示例&#xff0c;供参考&#xff1a; your-project/|- public/| |- index.html # 应用程序的入口HTML文件…

【Matlab】基于粒子群优化算法优化BP神经网络的时间序列预测(Excel可直接替换数据)

【Matlab】基于粒子群优化算法优化BP神经网络的时间序列预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码5.1 fun.m5.2 main.m 6.完整代码6.1 fun.m6.2 main.m 7.运行结果 1.模型原理 基于粒子群优化算法&#xff08;Pa…

ubuntu 18.04 磁盘太满无法进入系统

安装了一个压缩包&#xff0c;装了一半提示磁盘空间少导致安装失败。我也没在意&#xff0c;退出虚拟机打算扩展硬盘。等我在虚拟机设置中完成扩展操作&#xff0c;准备进入虚拟机内部进行操作时&#xff0c;发现登录不进去了 shift 登入GUN GRUB设置项的问题 网上都是在开机…

持续贡献开源力量,棱镜七彩加入openKylin

近日&#xff0c;棱镜七彩签署 openKylin 社区 CLA&#xff08;Contributor License Agreement 贡献者许可协议&#xff09;&#xff0c;正式加入openKylin 开源社区。 棱镜七彩成立于2016年&#xff0c;是一家专注于开源安全、软件供应链安全的创新型科技企业。自成立以来&…

Cesium态势标绘专题-圆角矩形(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…