微服务注册中心Nacos入门

简介: 微服务注册中心Nacos入门

服务治理

服务治理的核心由三部分组成:服务提供者、服务消费者、注册中心。在分布式系统架构中,每个微服务在启动时,将自己的信息存储在注册中心,叫做服务注册。服务消费者从注册中心获取服务提供者的网络信息,通过该信息调用服务,叫做服务发现。image.png

服务提供者&服务消费者

服务的提供者&服务的消费者是相对的概念:

  • 比如用户服务调用订单服务,那么用户服务是订单服务的消费者,订单服务是用户服务的提供者。
  • 但是对于订单服务调用库存服务,那么订单服务就成为库存服务消费者,库存服务就是订单服务的提供者。image.png
  • 下载地址:https://github.com/alibaba/Nacos/releases
tar -xzvf nacos-server-1.1.4.tar.gz

编辑conf/application.properties文件:

#mysql数据库连接信息,需要自己创建数据库,sql脚本在conf/nacos-mysql.sql
server.port=8849  #3个nacos服务端口号分别为8849,8850,8851
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.1.14:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456

将conf/cluster.conf.example改为conf/cluster.conf,编辑文件:

192.168.1.5:8849
192.168.1.5:8850
192.168.1.5:8851

依次使用sh /bin/startup.sh命令启动。

nginx配置:

events{}
http {
    upstream nacos {
        server 192.168.1.5:8849;
        server 192.168.1.5:8850;
        server 192.168.1.5:8851;
    }
    server {
       listen 8848;  #客户端访问地址
       location / {
           proxy_pass http://nacos;
        }
    }
}

输入http://192.168.1.5:8848 登录nacos,用户名nacos,密码nacos。image.png

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

加入注解:(以前低版本需要写,现在其实不需要)

package com.tuling;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient  //高版本可以不写
public class Tulingvip01MsAlibabaNacosClientOrderApplication {
 public static void main(String[] args) {
  SpringApplication.run(Tulingvip01MsAlibabaNacosClientOrderApplication.class, args);
 }
}

写配置文件:

spring:
  datasource:
    druid:
      username: root
      password: 123456
      jdbcUrl: jdbc:mysql://192.168.1.14:3306/tuling-ms-alibaba?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
      driverClassName: com.mysql.jdbc.Driver
      initialSize: 5
      minIdle: 5
      maxActive: 20
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 300000
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      filters: stat,wall #\u914D\u7F6E\u8FC7\u6EE4\u5668
      maxPoolPreparedStatementPerConnectionSize: 20
      useGlobalDataSourceStat: true
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.5:8848
        #环境隔离
        namespace: 13499a23-e36e-41e7-8f8b-bd071bb8708e
        #分组隔离
        group: pay
        #cluster不相同可以调到,但是优先调本集群
        cluster-name: BJ
  application:
    name: order-center
server:
  port: 8080

启动order-center和product-center服务,验证两个服务注册到nacos上:image.png

服务Controller代码

order-center通过discoveryClient.getInstances获取product-center服务信息,然后调用product-center去查询数据库信息,最后返回信息给客户端。

package com.tuling.controller;
import com.tuling.entity.OrderInfo;
import com.tuling.entity.ProductInfo;
import com.tuling.mapper.OrderInfoMapper;
import com.tuling.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class OrderInfoController {
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private OrderInfoMapper orderInfoMapper;
    @Autowired
    private DiscoveryClient discoveryClient;
    @RequestMapping("/selectOrderInfoById/{orderNo}")
    public Object selectOrderInfoById(@PathVariable("orderNo") String orderNo) {
        OrderInfo orderInfo = orderInfoMapper.selectOrderInfoById(orderNo);
        if(null == orderInfo) {
            return "根据orderNo:"+orderNo+"查询没有该订单";
        }
        /**
         * 从nacos server获取 product-info的地址
         */
        List<ServiceInstance> serviceInstanceList =  discoveryClient.getInstances("product-center");
        if(null == serviceInstanceList || serviceInstanceList.isEmpty()) {
            return "用户微服务没有对应的实例可用";
        }
        /**
         * 获取第0个元素
         */
        String targetUri = serviceInstanceList.get(0).getUri().toString();
        ResponseEntity<ProductInfo> responseEntity= restTemplate.getForEntity(targetUri+"/selectProductInfoById/"+orderInfo.getProductNo(), ProductInfo.class);
        ProductInfo productInfo = responseEntity.getBody();
        if(productInfo == null) {
            return "没有对应的商品";
        }
        OrderVo orderVo = new OrderVo();
        orderVo.setOrderNo(orderInfo.getOrderNo());
        orderVo.setUserName(orderInfo.getUserName());
        orderVo.setProductName(productInfo.getProductName());
        orderVo.setProductNum(orderInfo.getProductCount());
        return orderVo;
    }
    @GetMapping("/getServiceList")
    public List<ServiceInstance> getServiceList() {
        List<ServiceInstance> serviceInstanceList =  discoveryClient.getInstances("order-center");
        return serviceInstanceList;
    }
}

调用order-center接口查询订单信息:image.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
7月前
|
人工智能 安全 Nacos
Nacos 3.0:微服务与AI融合的技术新纪元
Nacos 3.0:微服务与AI融合的技术新纪元
358 83
|
4月前
|
人工智能 Java API
Nacos 3.1.0 正式发布,支持 A2A 注册中心与 MCP 注册协议增强
3.1.0 发布核心全新功能-Agent 注册中心,助力构建基于 A2A 协议的多 Agent 协作的AI应用,同时 MCP 注册中心适配最新 MCP 官方注册中心协议及升级优化多项核心功能。
1089 42
|
7月前
|
人工智能 安全 Java
Nacos 3.0:从微服务治理到AI服务治理的跃迁
Nacos 3.0:从微服务治理到AI服务治理的跃迁
417 5
|
7月前
|
人工智能 自然语言处理 安全
Nacos 3.0:微服务与AI融合的新一代动态治理平台
Nacos 3.0:微服务与AI融合的新一代动态治理平台
403 2
|
7月前
|
人工智能 自然语言处理 Nacos
Nacos 3.0:微服务与AI融合的全新治理平台
Nacos 3.0:微服务与AI融合的全新治理平台
296 46
|
负载均衡 Kubernetes 网络协议
注册中心如何选型?Eureka、Zookeeper、Nacos怎么选
这是小卷对分布式系统架构学习的第9篇文章,继续探讨注册中心的原理及选型。文章详细介绍了Eureka、Nacos的工作机制与特点,并对比了Eureka、Nacos、Consul和Zookeeper在一致性协议、健康检查、负载均衡等方面的差异。最后根据不同的应用场景给出了注册中心的选型建议,帮助读者理解如何选择最适合的注册中心。
1102 100
|
存储 网络协议 Nacos
高效搭建Nacos:实现微服务的服务注册与配置中心
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。它旨在帮助开发者更轻松地构建、部署和管理分布式系统,特别是在微服务架构中。
2076 81
高效搭建Nacos:实现微服务的服务注册与配置中心
|
8月前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
946 0