SpringCloudAlibaba技术整理(一)服务治理Nacos

SpringCloudAlibaba技术整理(一)服务治理Nacos

前言
同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

依托 Spring Cloud Alibaba,开发者只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。


SpringCloudAlibaba包含组件:
image.png

开源组件

  • Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

  • Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

  • RocketMQ:开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

  • Dubbo:在国内应用非常广泛的一款高性能 Java RPC 框架。

  • Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

  • Arthas:开源的Java动态追踪工具,基于字节码增强技术,功能非常强大。

商业化组件

  • Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。

  • Alibaba Cloud OSS:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的云存储服务。

  • Alibaba Cloud SchedulerX:阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准的定时(基于 Cron 表达式)任务调度服务。

集成 Spring Cloud 组件

  • Spring Cloud Alibaba 作为整套的微服务解决组件,可以集成 Zuul,OpenFeign等网关,也支持 Spring Cloud Stream 消息组件。

Nacos安装

  • 下载安装nacos

    环境以及详细配置参考nacos快速开始
    github下载nacos-server.zip, 解压后进入bin目录以单机模式启动
startup.cmd -m standalone
  • 访问nacos web页面

    nacos-server启动后, 默认地址为
    http://127.0.0.1:8848/nacos/index.html
    初始账号密码为nacos/nacos
    image.png

Nacos服务治理

一. 创建Maven项目SpringCloudAlibabaDemo

image.png

  • 编辑pom文件

    引入springboot, springcloud, springcloudalibaba依赖
<packaging>pom</packaging>
	<!-- SpringBootParent版本 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
    </parent>

    <properties>
        <!-- JDK版本, 字符集 -->
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- 声明SpringCloud版本 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 声明SpringCloudAlibaba版本 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

二. 创建服务提供者UserInfoProvider1模块

image.png

  • UserInfoProvider1模块pom文件引入依赖

<packaging>jar</packaging>

    <dependencies>
        <!-- mvc -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- spring boot actuator 端点监控, spring cloud alibaba 中必须引入, 否则启动报错 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- 服务发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
  • UserInfoProvider1模块启动类

package cn.zack;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * 使用@EnableDiscoveryClient注解表明为服务发现客户端
 * userInfo服务提供者1
 */
@EnableDiscoveryClient
@SpringBootApplication
public class UserInfoProvider1Application {
    public static void main(String[] args) {
        SpringApplication.run(UserInfoProvider1Application.class, args);
    }
}
  • 编辑application.yml配置文件

server:
  port: 8081

spring:
  application:
    # 服务提供者应用名
    name: userInfoProvider
  cloud:
    nacos:
      discovery:
        # nacos注册中心地址
        server-addr: 127.0.0.1:8848
# 将所有节点注册到nacos
management:
  endpoints:
    web:
      exposure:
        include: "*"
  • 编写UserInfoProviderController

package cn.zack.controller;

import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 支持rest调用
 */
@RestController
public class UserInfoProviderController {

    @GetMapping(path = "fun1")
    public JSONObject fun1(@RequestParam Integer param) {
	int a = 1 / param;
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("result", "调用了userInfoProvider1, 方法: fun1");
        return jsonObject;
    }
}

  • 启动UserInfoProvider1模块

在Nacos的服务列表页面可以看到服务提供者已经注册成功
// todo 截图
直接调用UserInfoProvider1中的接口
http://127.0.0.1:8081/fun1?param=1
可以正常得到响应
{"result":"调用了userInfoProvider1, 方法: fun1"}