Spring Cloud Alibaba+Nacos的介绍与实战(一)

目的

最近发现我对自己的博客https://www.cuzib.top的监控少之又少,无论从服务器资源上,还是从服务治理上,或者说服务日志上等等。从开始拥有自己的服务器,到上线自己的博客这几个月之间,由于缺乏服务器相关安全性知识,导致服务器以及博客前后遭到了三次的攻击。

服务器被攻击三次总结的文章:

并且,我现在的博客由于时间上的仓促,当时只是做了个捡漏的博客无论从页面还是后端,结构简单的单体应用服务,前后端并没有完全分离,牵一发而动全身。

所以,最近准备改造我的博客。
前端技术:vue
后端准备使用微服务框架,比如:Spring Cloud Alibaba全家桶(nacos、dubbo等)

Spring Cloud Alibaba

Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。

提起微服务,不得不提 Spring Cloud 全家桶系列,SpringCloud 是若干个框架的集合,包括 spring-cloud-config、spring-cloud-bus 等近 20 个子项目,提供了服务治理、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息队列、配置管理等领域的解决方案。

Spring Cloud 通过 Spring Boot 风格的封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、容易部署的分布式系统开发工具包。

一般来说,Spring Cloud 包含以下组件,主要以 Netflix 开源为主:
在这里插入图片描述
同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

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

作为 Spring Cloud 体系下的新实现,Spring Cloud Alibaba 跟官方的组件或其它的第三方实现如 Netflix, Consul,Zookeeper 等对比,具备了更多的功能。

Spring Cloud和Spring Cloud Alibaba

在这里插入图片描述
改造博客的过程中也学习一些Spring Cloud Alibaba相关技术,比如:nacos、dubbo等。

Spring Cloud Alibaba 包含组件

在这里插入图片描述
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

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

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

Dubbo:这个就不用多说了,在国内应用非常广泛的一款高性能 Java RPC 框架。

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

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

Spring Cloud Alibaba 功能

那么作为微服务解决方案, Spring Cloud Alibaba是如何支持微服务治理的各个功能。

服务注册与发现

Spring Cloud Alibaba 基于 Nacos 提供 spring-cloud-alibaba-starter-nacos-discovery & spring-cloud-alibaba-starter-nacos-config 实现了服务注册 & 配置管理功能。依靠 @EnableDiscoveryClient 进行服务的注册,兼容 RestTemplate & OpenFeign 的客户端进行服务调用。

适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。

支持多协议的服务调用

Spring Cloud 默认的服务调用依赖 OpenFeignRestTemplate 使用 REST 进行调用。

使用 @DubboTransported 注解可将底层的 Rest 协议无缝切换成 Dubbo RPC 协议,进行 RPC 调用。

@FeignClient("dubbo-provider")
@DubboTransported(protocol = "dubbo")
public interface DubboFeignRestService {
  @GetMapping(value = "/param")
  String param(@RequestParam("param") String param);

  @PostMapping("/saveB")
  String saveB(@RequestParam("a") int a, @RequestParam("b") String b);
}

服务限流降级

作为稳定性的核心要素之一,服务限流和降级是微服务领域特别重要的一环,Spring Cloud Alibaba 基于 Sentinel,对 Spring 体系内基本所有的客户端,网关进行了适配,

默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入。

Sentinel应用比较简单,只需引入 starter,即可生效,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。

微服务消息驱动

支持为微服务应用构建消息驱动能力,基于 Spring Cloud Stream 提供 Binder 的新实现: Spring Cloud Stream RocketMQ Binder,

也新增了 Spring Cloud Bus 消息总线的新实现 Spring Cloud Bus RocketMQ。

分布式事务

使用 Seata 解决微服务场景下面临的分布式事务问题。

使用 @GlobalTransactional 注解,在微服务中传递事务上下文,可以对业务零侵入地解决分布式事务问题。

阿里云提供的商业能力

通过上面提到的OSS,schedulerx等组件,开发者可以在阿里云上实现对象存储,分布式任务调度等功能。

nacos服务注册

首先是nacos的安装
下载地址:https://github.com/alibaba/nacos/releases
不过github下载极其特别的慢,当然你能FQ或者使用其他技巧下载很快的话,你就不需要通过以下方式下载了。
源码:https://cuizb.top/static/share/nacos-server-2.0.3.tar.gz
windows/liunx版:https://cuizb.top/static/share/nacos-server-2.0.3.zip

下载后解压,然后在/bin下,直接双击运行startup.cmd 即可默认启动单机版Nacos。

当然,你可以根据自己需要下载不同的平台系统,运行不同的命令,运行Nacos:

  • Windows:cmd startup.cmd -m standalone

  • Linux/Unix/Mac:sh startup.sh -m standalone
    在这里插入图片描述
    地址:http://127.0.0.1:8848/nacos
    账号:nacos 密码:nacos

首页
在这里插入图片描述

新建父工程

代码已经提交到gitee
地址:https://gitee.com/culzb/cloud-alibaba-demo
父工程:cloud-alibaba-demo
在这里插入图片描述
pom.xml主要配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.1.RELEASE</version>
</parent>
<modules>
  <module>gtw</module>
    <module>demo-service</module>
</modules>

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.9.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>0.9.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
            <!--  nacos注册中心-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
        </dependencies>
    </dependencyManagement>
    </dependencies>
</dependencyManagement>
<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

新建子模块demo-service

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.cuizb</groupId>
		<artifactId>cloud-alibaba-demo</artifactId>
		<version>1.0</version>
	</parent>
	<groupId>com.cuizb.cloud.alibaba</groupId>
	<artifactId>demo-service</artifactId>
	<version>1.0</version>
	<name>demo-service</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

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

</project>

启动类加上注解 @EnableDiscoveryClient

package com.cuizb.cloud.alibaba.demoservice;

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

@EnableDiscoveryClient
@SpringBootApplication
public class DemoServiceApplication {

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

新建api接口,提供服务

package com.cuizb.cloud.alibaba.demoservice.api;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author cuizb
 * @Date 2022-03-19 18:09:31
 * @Desc *
 */
@RestController
public interface DemoService {

    @GetMapping("/hello")
    String hello(@RequestParam("name") String name);
}

实现类

package com.cuizb.cloud.alibaba.demoservice.controller;

import com.cuizb.cloud.alibaba.demoservice.api.DemoService;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * @Author cuizb
 * @Date 2022-03-19 18:10:05
 * @Desc *
 */
@Service
public class DemoServiceImpl implements DemoService {

    @Override
    public String hello(String name) {
        if (StringUtils.isEmpty(name)) {
            name = "cuizb";
        }
        return "hello , " + name + " , i am demoService.";
    }
}

配置application.properties

server.port = 8701
spring.application.name=demo-service

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

启动程序
在这里插入图片描述

新建子模块服务消费者gtw

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.cuizb</groupId>
		<artifactId>cloud-alibaba-demo</artifactId>
		<version>1.0</version>
	</parent>
	<groupId>com.cuizb.cloud.alibaba</groupId>
	<artifactId>gtw</artifactId>
	<version>1.0</version>
	<name>gtw</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

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

</project>

启动类加入注解@EnableDiscoveryClient

package com.cuizb.cloud.alibaba.gtw;

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

@EnableDiscoveryClient
@SpringBootApplication
public class GtwApplication {

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

}

配置类RestTemplateConfig,将RestTemplate的bean注入到spring容器中

package com.cuizb.cloud.alibaba.gtw.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @Author cuizb
 * @Date 2022-03-19 18:16:44
 * @Desc *
 */
@Configuration
public class RestTemplateConfig {

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

新建路由

package com.cuizb.cloud.alibaba.gtw.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @Author cuizb
 * @Date 2022-03-19 18:12:16
 * @Desc *
 */
@RestController
public class GtwServiceImpl {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/hello")
    public String hello(@RequestParam("name") String name) {
        System.out.println(name);
        return restTemplate.getForObject("http://demo-service/hello?name=" + name , String.class);

    }
}

配置application.properties


server.port = 8705
spring.application.name=gtw

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

启动程序
在这里插入图片描述

测试

http://localhost:8705/hello?name=cuizb1
在这里插入图片描述

本文作者:Java技术债务
原文链接:https://www.cuizb.top/myblog/article/1647705645
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 3.0 CN协议进行许可。转载请署名作者且注明文章出处。

在这里插入图片描述
JVM内存泄漏和内存溢出的原因
JVM常用监控工具解释以及使用
Redis 常见面试题(一)
ClickHouse之MaterializeMySQL引擎(十)
三种实现分布式锁的实现与区别
线程池的理解以及使用

号外!号外!

最近面试BAT,整理一份面试资料,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。想获取吗?如果你想提升自己,并且想和优秀的人一起进步,感兴趣的朋友,可以在扫码关注下方公众号。资料在公众号里静静的躺着呢。。。

  • 喜欢就收藏
  • 认同就点赞
  • 支持就关注
  • 疑问就评论

一键四连,你的offer也四连

————————————————————————————————————————————————————————————————

posted @ 2022-06-30 20:52  Java技术债务  阅读(131)  评论(0编辑  收藏  举报