当前位置: 首页 > news >正文

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就具有了客户端负载均衡能力@Beanpublic RestTemplate restTemplate(){ // 创建RestTemplate,并交个Spring容器管理return new RestTemplate();}
}

消费者调用接口

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

启动项目测试调用执行:

curl localhost:9001/test

在这里插入图片描述

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

相关文章:

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

SpringCloudAlibaba微服务实战系列&#xff08;一&#xff09;Nacos服务注册发现 实战前先做一个背景了解。 单体架构、SOA和微服务 单体架构&#xff1a;近几年技术的飞速发展&#xff0c;各种各样的服务已经进入到网络化。单体架构发布时只需要打成一个war或jar包发布即可&a…...

23.7.27 牛客暑期多校4部分题解

1010 - Kong Ming Qi 1005 - Data Generation 题意、思路待补 code #include <bits/stdc.h> using namespace std; const long long MOD 998244353; int t; long long n, m; long long sub(long long a, long long b) {return a - b < 0 ? a - b MOD : a - b;}…...

Ubuntu 20.04 安装教程

最近貌似很多同学都在下载 ubuntu 虚拟机&#xff0c;但网上很多的安装教程不是很全&#xff0c;所以今天重新更新一下这篇博文&#xff08;更新日期&#xff1a;2022.12.3&#xff09;&#xff0c;希望能帮到大家。除此之外&#xff0c;安装过程确实比较繁琐&#xff0c;可能会…...

如何评判算法好坏?复杂度深度解析

如何评判算法好坏&#xff1f;复杂度深度解析 1. 算法效率1.1 如何衡量一个算法好坏1.2 算法的复杂度 2 时间复杂度2.1 时间复杂度的概念2.1.1 实例 2.2 大O的渐进表示法2.3 常见时间复杂度计算举例 3 空间复杂度4 常见复杂度对比5 结尾 1. 算法效率 1.1 如何衡量一个算法好坏 …...

【HashMap】2352. 相等行列对

2352. 相等行列对 解题思路 使用哈希容器遍历grid数组 将每一行的字符全部转换为StringBuilde对象 然后存入map中遍历每一列 将其转换为字符串 然后查找Map中是否存在 如果存在 统计 class Solution {public int equalPairs(int[][] grid) {// 哈希容器Map<String,Intege…...

如何声明静态方法 和 实现?

如何声明静态方法 和 实现&#xff1f;在 C 中&#xff0c;声明和实现静态方法&#xff08;静态成员函数&#xff09;与普通成员函数有一些区别。静态方法属于类本身&#xff0c;而不是类的对象&#xff0c;因此在声明和实现时需要特殊的语法。 声明静态方法&#xff1a; 在类…...

哈工大计算机网络课程局域网详解之:无线局域网

哈工大计算机网络课程局域网详解之&#xff1a;无线局域网 文章目录 哈工大计算机网络课程局域网详解之&#xff1a;无线局域网IEEE 802.11无线局域网802.11体系结构802.11&#xff1a;信道与AP关联 本节介绍一下平时经常使用的一个无线局域网技术&#xff0c;也就是通常我们使…...

系统集成|第六章(笔记)

目录 第六章、整体管理6.1 项目整体管理概述6.2 主要过程6.2.1 制订项目章程6.2.2 制订项目管理计划6.2.3 指导与管理项目工作6.2.4 监控项目工作6.2.5 实施整体变更控制6.2.6 结束项目或阶段 上篇&#xff1a;第五章、立项管理 第六章、整体管理 6.1 项目整体管理概述 概述&a…...

MySQL主从复制环境部署

文章目录 MySQL主从复制什么是主从复制&#xff1a;为什么需要主从复制&#xff1a;配置文件修改-主&#xff1a;时间同步&#xff1a;重启服务-主&#xff1a;创建同步用户&#xff1a;查看主上的二进制文件名及位置&#xff1a;配置-从&#xff1a;测试:注&#xff1a; MySQL…...

day42-servlet下拉查询/单例模式

0目录 1.Servlet实现下拉查询&#xff08;两表&#xff09; 2.单例模式 1.实战 1.1 创建工程&#xff0c;准备环境... 1.2 接口 1.3 重写方法 1.4 servlet 1.5 list.jsp list.jsp详解 2.单例模式 2.1 饿汉模式&#xff1a;在程序加载时直接创建对象&#…...

docker中设置容器健康检查

文章目录 一、docker-compose方式二、Dockerfile方式三、docker run方式四、查看检查日志 一、docker-compose方式 在docker-compose中加入healthcheck healthcheck 支持下列选项&#xff1a; test&#xff1a;健康检查命令&#xff0c;例如 ["CMD", "curl&quo…...

azure-cognitiveservices-speech api error while using with AWS Lambda

Azure 语音评估服务 Cancellation Reason 初始化平台失败 1.在mac上安装 pip install azure-cognitiveservices-speech1.30.0正常运行没有问题&#xff0c;服务部署到docker 容器中后调用Azure语音评估服务报错 Cancellation Reason 初始化平台失败 2.解决方案&#xff0c;变…...

系统集成项目管理工程师挣值分析笔记大全

系统集成项目管理工程师挣值分析笔记大全 挣值分析是一种项目管理技术&#xff0c;用于量化和监控项目绩效。它通过比较计划值&#xff08;PV&#xff09;、实际成本&#xff08;AC&#xff09;和挣值&#xff08;EV&#xff09;三个参数来评估项目的进展情况和成本绩效。 挣值…...

TCP 协议【传输层协议】

文章目录 1. 简介1.1 TCP 协议是什么1.2 TCP 协议的作用1.3 什么是“面向连接” 2. 简述 TCP2.1 封装和解包2.2 TCP 报文格式2.3 什么是“面向字节流”2.4 通过 ACK 机制实现一定可靠性 3. 详述 TCP3.1 基本认识TCP 报头格式16 位源/目标端口号32 位序列号*32 位确认应答号4 位…...

Golang 中的 time 包详解(二):time.Duration

在日常开发过程中&#xff0c;会频繁遇到对时间进行操作的场景&#xff0c;使用 Golang 中的 time 包可以很方便地实现对时间的相关操作。接下来的几篇文章会详细讲解 time 包&#xff0c;本文讲解一下 time 包中的 time.Duration 类型。 time.Duration time.Duration 类型是…...

Linux 学习记录58(ARM篇)

Linux 学习记录58(ARM篇) 本文目录 Linux 学习记录58(ARM篇)一、GIC相关寄存器1. 系统框图2. 中断号对应关系 二、GICD寄存器1. GICD_CTLR2. GICD_ISENABLERx3. GICD_IPRIORITYRx4. GICD_ITARGETSRx5. GICD_ICPENDRx 三、GICC寄存器1. GICC_PMR2. GICC_CTLR3. GICC_IAR4. GICC_…...

【一文搞懂】—带霍尔编码器的直流有刷减速电机

文章目录 一、直流有刷电机二、减速比三、霍尔编码器3.1 霍尔编码器3.2 霍尔编码器测速原理 四、测速程序设计4.1 跳变沿检测4.2 计算转速 一、直流有刷电机 宏观上说直流有刷电机由固定部分&#xff08;定子&#xff09;和旋转部分&#xff08;转子&#xff09;组成。在定子上…...

滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句

目录 一、缓冲区溢出的HelloWorld二、永不停止的HelloWorld三、基础知识3.1 变量的声明3.2 类型转换&#xff08;一般用于小转大&#xff09;3.3 表达式3.4 语句和程序块3.5 参数与返回值3.6 关系运算符3.7 逻辑运算符&#xff1a;&& || !3.8 单目运算符3.9 三目运算符…...

Python抓取分享页面的源代码示例

本文章是关于利用Python方法来抓取某网站分享页面中的源码方法示例。需要大家注意的是Python抓取分享页面的源代码示例&#xff0c;是要在运行时导入BeautifulSoup.py文件后才可以使用。 Python抓取分享页面的源代码示例&#xff0c;需要用到python urllib2模块方法&#xff0…...

linux安装nginx遇到的报错

1、Linux如何修改只读文件&#xff08;以设置自动连网为例&#xff09; vim /etc/sysconfig/network-scripts/ifcfg-ens33 然后提示 E45&#xff1a;已设定选项“readonly”&#xff08;请加&#xff01;强制执行&#xff09; 如果需要强制修改&#xff0c;可以使用&#xff0…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

RLHF vs RLVR:对齐学习中的两种强化方式详解

在语言模型对齐&#xff08;alignment&#xff09;中&#xff0c;强化学习&#xff08;RL&#xff09;是一种重要的策略。而其中两种典型形式——RLHF&#xff08;Reinforcement Learning with Human Feedback&#xff09; 与 RLVR&#xff08;Reinforcement Learning with Ver…...