Spring Cloud Alibaba 之 Nacos 的安装及使用

Nacos简介

Nacos 可以发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

其中,Nacos实现注册中心和分布式配置中心,默认的端口号是8848。

Nacos安装与启动

1、环境准备

  • Centos7系统环境
  • JDK1.8
  • Nacos安装包

2、下载

wget https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.tar.gz

3、解压安装包

tar  -zxvf nacos-server-1.1.4.tar.gz

4、单击启动
切换到 /nacos/bin 路径下,输入启动命令:

sh startup.sh -m standalone

启动日志可以在 /usr/local/leyou/nacos/logs/start.out 里查看。
查看日志的命令:

tail -f /usr/local/leyou/nacos/logs/start.out

5、开放端口8848
由于Nacos默认端口号是8848,所以在本地测试之前需要将端口打开。

1、开启防火墙
systemctl start firewalld
2、开放指定端口
firewall-cmd --zone=public --add-port=1935/tcp --permanent
命令含义:
–zone #作用域
–add-port=1935/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
3、重启防火墙
firewall-cmd --reload
4、查看端口号
netstat -ntlp //查看当前所有tcp端口·

端口打开之后,在本地电脑测试,在浏览器地址栏输入地址(服务器ip加端口号/nacos):http://192.168.18.132:8848/nacos
默认账号密码都是 nacos 。即可进入 Nacos 管理页面。
在这里插入图片描述

Nacos使用

我们都知道Nacos提供服务注册与发现和配置管理,下面一起来看一下具体是如何使用的。

服务注册

下面编写两个应用 服务提供者与服务消费者 来验证服务的注册与发现。
服务提供者
1、添加依赖
首先需要创建一个 Spring Boot 项目,在 pom.xml 中添加以下依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tfjybj.exam</groupId>
    <artifactId>exam_parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0-SNAPSHOT</version>
    <modules>
        <module>meiti-member</module>
        <module>mayikt-order</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>0.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
<!--        springboot 整合web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
</project>

主要内容有三部分:

  • :指定Spring Boot版本。
  • :指定spring cloud alibaba 的版本,进行版本管理。
  • :当前项目依赖的jar包。引入了Nacos的服务注册与发现依赖 spring-cloud-starter-alibaba-nacos-discovery 和 spring-boot-starter-web 依赖。

2、在项目下建立一个Maven Module。创建应用主类,并实现一个HTTP接口
应用主类:

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

创建一个service包,在其下创建一个service类实现一个HTTP接口:

@RestController
public class ProviderService {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/getUser")
    public String getUser(Integer userId){
        return "Provider,server port is:"+serverPort;
    }
}

3、配置服务名称和Nacos地址
在配置文件application.yml中加入以下内容:

spring:
  application:
    name: Provider
  cloud:
    nacos:
      discovery:
        #nacos的注册地址
        server-addr: 192.168.18.132:8848
server:
  port: 8081

4、启动项目测试效果

项目运行成功后,打开Nacos 管理页面,在服务管理下的服务列表可以看到注册上的服务 Provider。
在这里插入图片描述

服务消费者

在建立好的Spring Boot项目中再新建一个 Maven Module 来充当服务消费者。
1、添加服务名称和Nacos注册地址。
在配置文件中application.yml中添加以下内容:

spring:
  application:
    name: Discovery
  cloud:
    nacos:
      discovery:
        #nacos注册地址
        server-addr: 127.0.0.1:8848
server:
  port: 8090

2、创建应用主类,并实现一个HTTP接口,在该接口中调用服务提供者的接口。
从注册中心获取服务或服务集群的列表的话,通过RPC远程调用涉及到本地负载均衡算法,用负载均衡算法从列表选择一个服务,负载均衡算法有以下几种:

  • 一致性hash算法
  • 轮询,权重
  • 随机

(1)轮询的负载均衡算法的实现思路:
为了保证线程安全,这里使用了 AtomicInteger ,去实现轮询的负载均衡算法。

public interface LoadBalancer {

    /***
     * 从注册中心集群列表中获取单个地址
     * @param serviceInstances
     * @return
     */
    ServiceInstance getSingleAddress(List<ServiceInstance> serviceInstances);
}
@Component
public class RotationLoadBalancer implements LoadBalancer {

    /***
     * 从0开始计数
     */
    private AtomicInteger atomicInteger=new AtomicInteger(0);

    @Override
    public ServiceInstance getSingleAddress(List<ServiceInstance> serviceInstances) {
        int index=atomicInteger.incrementAndGet()%serviceInstances.size();
        return serviceInstances.get(index);
    }
}

(2)实现一个HTTP接口


@RestController
public class OrderService {

    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancer loadBalancer;

    @RequestMapping("/orderToMember")
    public Object orderToMember(){
        //1、根据服务名称从 注册中心获取集群列表地址
        List<ServiceInstance> instances = discoveryClient.getInstances("Provider");
        //2、列表任意选择一个 实现本地RPC调用rest
        ServiceInstance serviceInstance = loadBalancer.getSingleAddress(instances);
        URI rpcMemberUrl = serviceInstance.getUri();
        String result = restTemplate.getForObject(rpcMemberUrl+"/getUser", String.class);
        return "订单调用会员返回结果:"+result;
    }

     /***
     * 第一种方式
     * 基于Ribbon实现本地负载均衡
     * @return
     */
    @RequestMapping("/orderToRibbonMember")
    public Object orderToRibbonMember(){
        String result = restTemplate.getForObject("http://Provider/getUser", String.class);
        return "订单调用会员返回结果:"+result;
    }

    /***
     * 第二种方式
     * 根据loadBalancerClient实现客户端负载均衡
     * @return
     */
    @RequestMapping("/loadBalancerClientMember")
    public Object loadBalancerClientMember(){
        ServiceInstance result=loadBalancerClient.choose("Provider");
        return result;
    }

}

这里使用了Spring cloud common中的LoadBalancer来挑选服务实例信息,然后从挑选出的实例信息中获取可以可访问的URI,拼接上服务提供者的接口名字来发起调用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值