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

SpringCloud Alibaba系列 Nacos(一)

SpringCloudAlibaba官网:Spring Cloud Alibaba

SpringCloudAlibaba全家桶

服务注册发现:Nacos
服务限流降级:Sentinel
分布配置中心:Nacos
服务网关:SpringCloud Gateway
服务之间调用:Feign、Ribbon
链路追踪:Sleuth+Zipkin

注册中心(服务治理)

  • 什么是注册中心(服务治理)?

  • 服务注册:服务提供者provider,启动的时候向注册中心上报自己的网络信息
  • 服务发现:服务消费者consumer,启动的时候向注册中心上报自己的网络信息,拉取provider的相关网络信息
  • 核心:服务管理,有个服务注册表,心跳机制动态维护,服务实例在启动时注册到服务注册表,并在关闭时注销
  • 注册中心的作用?

微服务应用和机器越来越多,调用方需要知道接口的网络地址,如果靠配置文件的方式去控制网络地址,对于动态新增机器,维护带来很大问题

  • 主流的注册中心有哪些?

zookeeper、Eureka、consul、etcd、Nacos

什么是Nacos?

Nacos官网:https://nacos.io/zh-cn/

  • Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
  • Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
  • Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。


上手Nacos

  • 环境准备

  • 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  • 64 bit JDK 1.8+
  • Maven 3.2.x+
  • Nacos需要至少2核CPU 4G内存 60g*3的机器配置下运行。
  • 从 Github 上下载 Nacos

https://github.com/alibaba/nacos

  • 启动 Nacos 服务

Windows

cd nacos/bin

startup.cmd -m standalone        // 单机启动

Linux

cd nacos/bin

sh startup.sh -m standalone        // 单机启动

  • 关闭 Nacos 服务

Windows

双击 shutdown.cmd

Linux

sh shutdown.sh

默认端口 8848

访问地址:http://ip:8848/nacos

默认账号密码:nacos/nacos


SpringCloud Alibaba 整合 Nacos 实现服务的注册与发现

maven版本管理如下

	<properties>
		<!-- jdk版本 -->
		<java.version>17</java.version>
		<!-- maven 打包版本 -->
		<maven.compiler.source>17</maven.compiler.source>
		<maven.compiler.target>17</maven.compiler.target>
		<maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
		<!-- 编码 -->
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

		<spring.boot.version>2.7.4</spring.boot.version>
		<spring.cloud.version>2021.0.4</spring.cloud.version>
		<spring.cloud.alibaba.version>2021.0.4.0</spring.cloud.alibaba.version>
	</properties>

	<dependencyManagement>
		<dependencies>
			<!-- spring boot 版本 -->
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>${spring.boot.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>

			<!-- spring cloud 版本 -->
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring.cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>

			<!-- spring cloud alibaba 版本 -->
			<dependency>
				<groupId>com.alibaba.cloud</groupId>
				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
				<version>${spring.cloud.alibaba.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

子服务 pom 中添加注册发现依赖

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

application.yml 文件配置 nacos

spring:
  application:
    # 配置子服务名称
    name: user-service
  cloud:
    nacos:
      # 配置 nacos 服务地址
      discovery:
        server-addr: 127.0.0.1:8848

通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能

 启动子服务,可以看到服务已经在 nacos 注册成功


Nacos注册中心的作用?

当没有注册中心的时候,A服务调用B服务如下

http://B的ip:端口/api?xxx=xxx

使用Nacos

http://serviceInstance.getHost()+serviceInstance.getPort()/api?xxx=xxx

示例 (没有负载均衡)

	@Bean
	public RestTemplate getRestTemplate() {
		return new RestTemplate();
	}
@Service
public class UserServiceImpl implements UserService {

	@Autowired
	private DiscoveryClient discoveryClient;

	@Autowired
	private RestTemplate restTemplate;

	/**
	 * 用户服务调用订单服务
	 * @param orderId 订单id
	 */
	@Override
	public OrderDO getOrderDetail(Long orderId) {
		List<ServiceInstance> list = discoveryClient.getInstances("order-service");
		ServiceInstance serviceInstance = list.get(0);
		OrderDO orderDO = restTemplate.getForObject("http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/order/one?orderId="+orderId, OrderDO.class);
		return orderDO;
	}
}

示例(带客户端负载均衡)

	<!-- 调用方添加此依赖 -->
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-loadbalancer</artifactId>
	</dependency>
	@Bean
	@LoadBalanced
	public RestTemplate getRestTemplate() {
		return new RestTemplate();
	}
@Service
public class UserServiceImpl implements UserService {

	@Autowired
	private RestTemplate restTemplate;

	/**
	 * 用户服务调用订单服务
	 *
	 * @param orderId 订单id
	 */
	@Override
	public OrderDO getOrderDetail(Long orderId) {
		OrderDO orderDO = restTemplate.getForObject("http://order-service/order/one?orderId=" + orderId, OrderDO.class);
		return orderDO;
	}
}

相关文章:

  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • JS的精髓,事件详解
  • 高等数学(第七版)同济大学 习题8-6 个人解答
  • 【Linux】进程地址空间
  • 【计算机组成原理】输入/输出系统(四)—— I/O方式
  • 让GPU跑的更快
  • 给课题组师弟师妹们的开荒手册
  • Java操作Excel - Easy Excel
  • 交通状态预测 | Python实现基于LSTM的客流量预测方法
  • 一条sql语句在MySQL的执行流程
  • 当遇到听不了的歌,Python程序员都是这么做的...
  • leetcode-289:生命游戏
  • C语言中的结构体应用详解及注意事项
  • 【2022】Elasticsearch-7.17.6集群部署
  • 计算器——位运算(c语言)
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [译]前端离线指南(上)
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Date型的使用
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • dva中组件的懒加载
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Flannel解读
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Javascript弹出层-初探
  • JavaScript异步流程控制的前世今生
  • Java深入 - 深入理解Java集合
  • JS 面试题总结
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • STAR法则
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 基于Android乐音识别(2)
  • 前言-如何学习区块链
  • 如何在 Tornado 中实现 Middleware
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​io --- 处理流的核心工具​
  • ​香农与信息论三大定律
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $ git push -u origin master 推送到远程库出错
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C#)获取字符编码的类
  • (ZT)薛涌:谈贫说富
  • (力扣)1314.矩阵区域和
  • (论文阅读30/100)Convolutional Pose Machines
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET MVC第三章、三种传值方式