# SpringCloudAlibaba **Repository Path**: yuanmatansuo/spring-cloud-alibaba ## Basic Information - **Project Name**: SpringCloudAlibaba - **Description**: 微服务学习仓库 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-11-03 - **Last Updated**: 2024-07-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## SpringCloud Alibaba体系课件 springcloud是一套标准,而所有后续框架都是基于这套标准诞生, ### 企业级微服务协同开发注意事项 #### 1、Idea自动注释 在企业开发中,通常需要多人协同开发,甚至多项目组协同开发,特别是微服务项目。为了更好的维护项目,那需要在写代码时有良好的注释习惯。 ##### 类和接口注释 **位置:**File---Settings---Editor---File and Code Templates---Files,进入该页面后可选择Class、Interface、Enum等文件,对应右侧内容分别为: ![img](README.assets/12737df92e074dc3aeeba06c707fd9ee.png) ``` /** * @ClassName ${NAME} * @Description TODO * @Author (姓名或代号) * @Date ${DATE} ${TIME} * @Version 1.0 */ ``` ``` ${PACKAGE_NAME} : 包路径 ${NAME} : 文件名,该条语句可以获取到类名、接口名等 TODO:代办事项的标记,一般生成类或方法都需要添加描述 ${USER} : 主机用户名,设置创建类的用户 ${DATE} : 系统当前日期,格式为:yyyy/mm/dd,设置创建日期 ${TIME} : 系统当前时间 格式为:HH:mm,设置创建日期 ${YEAR}:当前年 ${MONTH}:当前月 ${MONTH_NAME_SHORT} : 月份名称简写;如:Jan, Feb, etc. ${MONTH_NAME_FULL} : 月份名称全拼;如:January, February. ${DAY} :当前天 ${DAY_NAME_SHORT} :星期简写;如:Mon, Tue, etc. ${DAY_NAME_FULL}:星期全写;如:Mon, Tue, etc. ${HOUR} : 当前小时 ${MINUTE} :当前分钟 ${PROJECT_NAME} : 项目名称 1.0:设置版本号,一般新创建的类都是1.0版本,此处可以直接写死 ``` ##### 方法注释 **位置:**File---Settings---Editor---Live Templates ![img](README.assets/f13bbd27505041e69007582add5beb04.png) 然后在建立好的methodTemplates模板上点击右侧的“**+**”,新建一个“**1.Live Template**”: ![img](README.assets/a0a815ca556d441b864e7e357e19fc81.png) 在③处输入模板的简写码:* 在④处输入方法的描述:add Comments for method 在⑤处输入注释模板代码,可变变量要用$来表示(两侧括起来),如果不这样设置,⑥不能点击打开 ``` ** * @MethodName $title$ * @Description $description$ $param$ $return$ $throws$ * @Author Jiangnan Cui * @Date $date$ $TIME$ */ ``` **注意**:代码的第一行必须要以* *开头,而不能以 / * *开头,否则会出现参数和返回值为空的情况 点击⑥对变量进行编辑,参数设置如下: ![img](README.assets/8c5e5f28ab2748b0905cf57462ce9e51.png) 其中: **param代码:** ``` groovyScript("def result=''; def stop=false; def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList(); if (params.size()==1 && (params[0]==null || params[0]=='null' || params[0]=='')) { stop=true; }; if(!stop) { for(i=0; i < params.size(); i++) {result +=((i==0) ? '\\r\\n' : '') + ((i < params.size() - 1) ? ' * @param: ' + params[i] + '\\r\\n' : ' * @param: ' + params[i] + '')}; }; return result;", methodParameters()) ``` **return代码:** ``` groovyScript("def result=''; def data=\"${_1}\"; def stop=false; if(data==null || data=='null' || data=='' || data=='void' ) { stop=true; }; if(!stop) { result += '\\r\\n' + ' * @return: ' + data; }; return result;", methodReturnType()) ``` 记得给右边的方框打勾,点击OK完成参数设置。 接下来设置该模板的作用范围,该位置首次设置是为**Define**,修改后设置时变为**Change**,可设置为**Everywhere**,表示任意位置都可以添加。 ![img](README.assets/2c667949565f4929845aa99884589e99.png) 附:首次设置时 ![img](README.assets/3ae92062e2f241b6ac4fb6e09625dcef.png) 点击右下方Options中的Expand With可设置配合使用的快捷键,有Tab、Space、Enter等,如果上面设置的模板关键词为*,此处可默认使用**Tab**作为快捷键。 ![img](README.assets/d14773f436e34016abbfd89018d3d5d7.png) 依次点击Apply、OK,完成方法注释模板的创建。**给类中方法添加注释时,输入/\*,然后按Tab完成注释添加** ### 微服务架构的优缺点 #### **1、优点:** - 每个服务够内聚,足够小,代码容易理解,这样能聚焦一个指定对业务功能或业务需求 - 开发简单、开发效率提高,一个服务可能就是专一的只干一件事 - 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段还是在部署阶段都是独立的 - 微服务能够使用不同的语言进行开发 - 易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如Jenkins、Hudson、bamboo - 微服务只是业务逻辑的代码,不会和HTML、CSS或其他界面组件混合 - 每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一数据库 #### **2、缺点:** - 开发人员要处理分布式系统的复杂性 - 多服务运维难度,随着服务的增加,运维的压力也在增大 - 系统部署依赖 - 服务间通信成本 - 数据一致性 - 系统集成测试 - 性能监控 ### SpringCloud常用 服务组件于技术 - 服务开发:Springboot、Spring等 - 服务配置与管理:Archaius、Diamond等 - 服务注册与发现:Eureka、Consul、Zookeeper等 - 服务调用:Feign等 - 消息队列:Kafka、RabbitMQ、ActiveMQ等 - 服务配置中心管理:SpringCloud Config、Chef等 - 服务路由(API网关):Zuul等 - 服务监控:Zabbix、Nagios、Metrics、Spectator等 - 全链路追踪:Zipkin、Brave、Dapper等 - 服务部署:Docker、OpenStack、Kubernetes等 - 数据流操作开发包:SpringCloud Stream(分装与Redis;Rabbit、Kafka等发送接收消息) - 事件消息总线:SpringCloud Bus ## Dubbo(RPC框架) 为什么用Dubbo? 1. 服务治理框架 2. 服务监控 3. 服务注册发现 4. 服务通信 5. 服务容错 6. 服务的负载均衡 ![image-20221030202546466](README.assets/image-20221030202546466.png) ### Dubbo官网 https://dubbo.apache.org/zh/index.html Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。 ### Dubbo入门 #### 1、创建工程 1. 创建工程名为SpringCloudAlibaba的工程 2. 在工程下创建cloud-xxxx-api Maven工程(统一实现接口工程) 3. 创建cloud-xxxx-provider的 SpringBoot服务提供者模块 4. 创建cloud-xxxx-consumer的 SpringBoot服务消费者模块 ##### api模块 consumer和provider去依赖api模块 ```java public interface IHelloWorld { String getHelloWorld(); } ``` ##### provider 服务的提供者 ````java /** * 服务的提供者 */ @SpringBootApplication @EnableDiscoveryClient @EnableDubbo public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } } ```` ```java @DubboService(interfaceClass = IHelloWorld.class, version = "1.0.0") public class HelloWorldImpl implements IHelloWorld { @Override public String getHelloWorld() { return "你好 微服务"; } } ``` ##### consumer 服务的消费者 ```java @SpringBootApplication @EnableDubbo public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } } ``` ```java @RestController public class HelloWorldController { @DubboReference(interfaceClass = IHelloWorld.class, //服务接口名 version = "1.0.0", //服务版本,与服务提供者的版本一致 check = false, //启动时检查提供者是否存在,true报错,false忽略 timeout = 10000, //服务方法调用超时时间(毫秒) //methods = @Method(name = "getUserAddressList"), //精确到服务接口的某个方法 retries = 3) //远程服务调用重试次数,不包括第一次调用,不需要重试请设为0 private IHelloWorld helloWorld; @GetMapping("/gethello") public String getHello(){ return helloWorld.getHelloWorld(); } } ``` Dubbo通过注解的形式去配置扫描包 ```java @DubboComponentScan("com.xxxx.xxx") ``` ### 2、注册中心 ##### dubbo实现注册中心的方式 实现方式 实现服务发现的方式有很多种,Dubbo 提供的是一种 Client-Based 的服务发现机制,通常还需要部署额外的第三方注册中心组件来协调服务发现过程,如常用的 **Nacos**、**Consul**、**Zookeeper** 等,Dubbo 自身也提供了对多种注册中心组件的对接,用户可以灵活选择。 dubbo是一套解决方案,那dubbo可以基于SpringBoot进行搭建,同时也可以基于SpringCloud的规范进行搭建。 Spring + Dubbo 标准化 SpringBoot + Dubbo 标准化 SpringCloud + Dubbo 标准化 ## 附录: ### 名词解析 **RPC框架** RPC 是远程过程调用的简写,RPC 与 HTTP 一样都可以实现远程服务的调用,但是使用方式上有很大的区别。它能够像使用本地方法一样调用远程的方法。 ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jwHG1k2r-1575018699617)(./images/1575010957687.png)]](README.assets/2019112917122333.png) **ORM框架** 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。