前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud Alibaba - 03 注册中心Nacos 应用篇(上)

Spring Cloud Alibaba - 03 注册中心Nacos 应用篇(上)

作者头像
小小工匠
发布2022-02-03 15:58:57
3150
发布2022-02-03 15:58:57
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构

文章目录

在这里插入图片描述
在这里插入图片描述

无注册中心直接调用Demo

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
package com.artisan.v1.controller;

import com.artisan.common.entity.OrderInfo;
import com.artisan.common.entity.ProductInfo;
import com.artisan.common.vo.OrderVo;
import com.artisan.mapper.OrderInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
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;

/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2022/2/1 21:20
 * @mark: show me the code , change the world
 */
@RestController
public class OrderInfoController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private OrderInfoMapper orderInfoMapper;


    /**
     * 调用地址,硬编码
     */
    public static final String uri = "http://localhost:9999/selectProductInfoById/";

    @RequestMapping("/selectOrderInfoById/{orderNo}")
    public Object selectOrderInfoById(@PathVariable("orderNo") String orderNo) {

        OrderInfo orderInfo = orderInfoMapper.selectOrderInfoById(orderNo);
        if (null == orderInfo) {
            return "根据orderNo:" + orderNo + "查询没有该订单";
        }
        // 发起远程Http调用
        ResponseEntity<ProductInfo> responseEntity = restTemplate.getForEntity(uri + 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;
    }
}
在这里插入图片描述
在这里插入图片描述

Order服务通过RestTemplate 调用方式调用远端的Product服务

我们来分析一下缺点

  • 在调用的时候,请求的Ip地址和端口是硬编码的.若此时,服务提供方(product)服务部署的机器换了端口或者是更换了部署机器的Ip,那么我们需要修改代码重新发布部署.
  • 假设我们的product服务压力过大,我们需要把product服务作为集群,那么意味着product是多节点部署比如原来的,我们只有一台服务器,现在有多台服务器,那么作为运维人员需要在服务消费方进行手工维护一份注册表(容易出错)
  • 当然了,上面的问题可以通过ng来做负载均衡,我首先认为这是可行的,但当时大规模的微服务, ng的配置文件复杂度可想而知。

注册中心的演进

详见 ProcessOn 6个版本的演进

Nacos Server 安装

下载地址 :https://github.com/alibaba/Nacos/releases

在这里插入图片描述
在这里插入图片描述

Linux 下的 安装 (单节点)

部署文档: https://nacos.io/zh-cn/docs/deployment.html

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
[root@VM-0-7-centos lb]# tar -xvzf  压缩包.tar.gz
 
[root@VM-0-7-centos lb]# cd nacos/bin
  
[root@VM-0-7-centos bin]# ./startup.sh  -m standalone   单机模式下运行
 
[root@VM-0-7-centos bin]#  lsof -i:8848

[root@VM-0-7-centos bin]#  sh shutdown.sh 停止nacos 

访问服务 http://ip:8848/nacos , 默认的用户名密码是 nocas/nocas

在这里插入图片描述
在这里插入图片描述

Nacos Client 接入

Step 1 搞依赖

代码语言:javascript
复制
      <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
        </dependency>

Step 2 搞注解 @EnableDiscoveryClient (高版本可省略)

代码语言:javascript
复制
@SpringBootApplication
@EnableDiscoveryClient
public class ArtisanNacosClientOrderApplication {

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

Step 3 搞配置

代码语言:javascript
复制
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 4.117.97.88:8848
  application:
    name: artisan-product-center

server-addr 不需要写协议(http) ,直接写 ip:port

Step 4 启动服务端和客户端

  1. 启动nacos server ,
  2. 启动 artisan-cloud-nacosclient-order 注册到nacos server
  3. 启动 artisan-cloud-nacosclient-product 注册到nacos server
在这里插入图片描述
在这里插入图片描述

Step 5 验证测试

OrderInfoController 类增加

代码语言:javascript
复制
    @GetMapping("/getInstance")
    public List<ServiceInstance> getInstances(@RequestParam(required = true) String appName) {
        return discoveryClient.getInstances(appName);
    }


    @GetMapping("/getServices")
    public List<String> getServices() {
        return discoveryClient.getServices();
    }
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源码

https://github.com/yangshangwei/SpringCloudAlibabMaster

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-02-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 无注册中心直接调用Demo
  • 注册中心的演进
  • Nacos Server 安装
    • Linux 下的 安装 (单节点)
    • Nacos Client 接入
      • Step 1 搞依赖
        • Step 2 搞注解 @EnableDiscoveryClient (高版本可省略)
          • Step 3 搞配置
            • Step 4 启动服务端和客户端
              • Step 5 验证测试
              • 源码
              相关产品与服务
              对象存储
              对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
              http://www.vxiaotou.com