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

网友投稿 571 2022-05-30

文章目录

无注册中心直接调用Demo

注册中心的演进

Nacos Server 安装

Linux 下的 安装 (单节点)

Nacos Client 接入

Step 1 搞依赖

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

Step 3 搞配置

Step 4 启动服务端和客户端

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

Step 5 验证测试

源码

无注册中心直接调用Demo

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

[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 搞依赖

com.alibaba.cloud spring-cloud-alibaba-nacos-discovery

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 启动服务端和客户端

启动nacos server ,

启动 artisan-cloud-nacosclient-order 注册到nacos server

启动 artisan-cloud-nacosclient-product 注册到nacos server

Step 5 验证测试

OrderInfoController 类增加

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

源码

https://github.com/yangshangwei/SpringCloudAlibabMaster

Spring Spring Cloud

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:为什么不用DriverManager.registerDriver(driver)
下一篇:Spring中Bean的讲解
相关文章