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

简介: Spring Cloud Alibaba - 03 注册中心Nacos 应用篇

6735aa4777de402592fbe82e8b40ee3d.png

注册中心直接调用Demo


626755f9fec5475fb9e683c918502935.png

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;
    }
}


597afe458a304a2ab3224f3a4399effb.png


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


我们来分析一下缺点


在调用的时候,请求的Ip地址和端口是硬编码的.若此时,服务提供方(product)服务部署的机器换了端口或者是更换了部署机器的Ip,那么我们需要修改代码重新发布部署.


假设我们的product服务压力过大,我们需要把product服务作为集群,那么意味着product是多节点部署比如原来的,我们只有一台服务器,现在有多台服务器,那么作为运维人员需要在服务消费方进行手工维护一份注册表(容易出错)


当然了,上面的问题可以通过ng来做负载均衡,我首先认为这是可行的,但当时大规模的微服务, ng的配置文件复杂度可想而知。


注册中心的演进


详见 ProcessOn 6个版本的演进


Nacos Server 安装


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


55e77d18bb0347bbaee8d1f9b59839ae.png


Linux 下的 安装 (单节点)

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


441940a06a8646b498021f5c8b2d894b.png

[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

4e30aedbb1474791804741fc3a45dc72.png


Nacos Client 接入

Step 1 搞依赖

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


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

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


Step 3 搞配置

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


0dfbf8b5dde74c4d98234cc4de2a79f1.png

Step 5 验证测试

OrderInfoController 类增加

    @GetMapping("/getInstance")
    public List<ServiceInstance> getInstances(@RequestParam(required = true) String appName) {
        return discoveryClient.getInstances(appName);
    }
    @GetMapping("/getServices")
    public List<String> getServices() {
        return discoveryClient.getServices();
    }


cdd18a624fa94acabf884c3ba6dc797d.png

b69dd2747efe49a9a606816b074754bc.png


1aab54545ce342638ee9af644b8d62c6.png


源码


https://github.com/yangshangwei/SpringCloudAlibabMaster

相关文章
|
2天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
14 3
|
3天前
|
安全 Java 开发者
深入理解Spring Boot配置绑定及其实战应用
【4月更文挑战第10天】本文详细探讨了Spring Boot中配置绑定的核心概念,并结合实战示例,展示了如何在项目中有效地使用这些技术来管理和绑定配置属性。
10 1
|
6天前
|
安全 Linux Nacos
如何使用公网地址远程访问内网Nacos UI界面查看注册服务
如何使用公网地址远程访问内网Nacos UI界面查看注册服务
18 0
|
3天前
|
监控 安全 Java
Spring cloud原理详解
Spring cloud原理详解
15 0
|
4天前
|
Java Spring 容器
深入理解Spring Boot启动流程及其实战应用
【5月更文挑战第9天】本文详细解析了Spring Boot启动流程的概念和关键步骤,并结合实战示例,展示了如何在实际开发中运用这些知识。
13 2
|
6天前
|
JavaScript Java 开发者
Spring Boot中的@Lazy注解:概念及实战应用
【4月更文挑战第7天】在Spring Framework中,@Lazy注解是一个非常有用的特性,它允许开发者控制Spring容器的bean初始化时机。本文将详细介绍@Lazy注解的概念,并通过一个实际的例子展示如何在Spring Boot应用中使用它。
18 2
|
7天前
|
消息中间件 负载均衡 Java
【Spring Cloud 初探幽】
【Spring Cloud 初探幽】
15 1
|
9天前
|
Java 开发者 微服务
Spring Cloud原理详解
【5月更文挑战第4天】Spring Cloud是Spring生态系统中的微服务框架,包含配置管理、服务发现、断路器、API网关等工具,简化分布式系统开发。核心组件如Eureka(服务发现)、Config Server(配置中心)、Ribbon(负载均衡)、Hystrix(断路器)、Zuul(API网关)等。本文讨论了Spring Cloud的基本概念、核心组件、常见问题及解决策略,并提供代码示例,帮助开发者更好地理解和实践微服务架构。此外,还涵盖了服务通信方式、安全性、性能优化、自动化部署、服务网格和无服务器架构的融合等话题,揭示了微服务架构的未来趋势。
32 6
|
13天前
|
JSON Java Apache
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient