Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务


目的

最近发现我对自己的博客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 Alibaba+Nacos的介绍与实战(一) - Java技术债务 同 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的介绍与实战(一) - Java技术债务 改造博客的过程中也学习一些Spring Cloud Alibaba相关技术,比如:nacos、dubbo等。

Spring Cloud Alibaba 包含组件

Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务 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下载极其特别的慢,当然你能翻墙或者使用其他技巧下载很快的话,你就不需要通过以下方式下载了。 源码: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 Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务 地址:http://127.0.0.1:8848/nacos 账号:nacos 密码:nacos

首页 Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务

新建父工程

代码已经提交到gitee 地址:https://gitee.com/culzb/cloud-alibaba-demo 父工程:cloud-alibaba-demo Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务 pom.xml主要配置


    org.springframework.boot
    spring-boot-starter-parent
    2.2.1.RELEASE


  gtw
    demo-service



    1.8
    Greenwich.SR1



    
        
            org.springframework.cloud
            spring-cloud-dependencies
            ${spring-cloud.version}
            pom
            import
        
        
            org.springframework.cloud
            spring-cloud-alibaba-dependencies
            0.9.0.RELEASE
            pom
            import
        
        
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
            
                org.springframework.cloud
                spring-cloud-alibaba-dependencies
                0.9.0.RELEASE
                pom
                import
            
            
                org.springframework.boot
                spring-boot-starter-test
            
            
            
                org.springframework.cloud
                spring-cloud-starter-alibaba-nacos-discovery
            
        
    
    


    ${project.artifactId}
    
        
            org.springframework.boot
            spring-boot-maven-plugin
        
    

新建子模块demo-service



	4.0.0
	
		com.cuizb
		cloud-alibaba-demo
		1.0
	
	com.cuizb.cloud.alibaba
	demo-service
	1.0
	demo-service
	Demo project for Spring Boot
	
		1.8
	
	
		
			org.springframework.boot
			spring-boot-starter-web
		

		
			org.springframework.boot
			spring-boot-starter-test
			test
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	



启动类加上注解 @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

启动程序 Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务

新建子模块服务消费者gtw

pom.xml配置



	4.0.0
	
		com.cuizb
		cloud-alibaba-demo
		1.0
	
	com.cuizb.cloud.alibaba
	gtw
	1.0
	gtw
	Demo project for Spring Boot
	
		1.8
	
	
		
			org.springframework.boot
			spring-boot-starter-web
		

		
			org.springframework.boot
			spring-boot-starter-test
			test
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	



启动类加入注解@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

启动程序 Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务

测试

http://localhost:8705/hello?name=cuizb1 Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务

   登录后才可以发表评论呦...

专注分享Java技术干货,包括
但不仅限于多线程、JVM、Spring Boot
Spring Cloud、 Redis、微服务、
消息队列、Git、面试题 最新动态等。

想交个朋友吗
那就快扫下面吧


微信

Java技术债务

你还可以关注我的公众号

会分享一些干货或者好文章

Java技术债务