从今天起简单的学习下springCloudAlibaba,也不用学太深,就是学了后几个笔记,如果不记笔记,感觉跟白学一样,心里慌慌的。
1、版本说明
springCloudAlibaba跟各种组件比如Nacos,Sentinel,Spring Boot等版本是一一对应的,这些可不能搞错了。版本对应关系可以参考https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
这里用的版本如下
- Spring Cloud Alibaba Version 2.2.6.RELEASE
- Spring Cloud Version Hoxton.SR9
- Spring Boot Version 2.3.2.RELEASE
- Sentinel Version 1.8.1
- Nacos Version 1.4.2
- RocketMQ Version 4.4.0
- Dubbo Version 2.7.8
- Seata Version 1.3.0
2、案例场景
这里开发环境用的是IDEA社区版,毕竟作为个人而言,社区版已经足够用了,没有必要去搞什么破解。
建个父工程,然后有两个子工程,其中一个是订单,一个是库存,库存起两份,都注册到nacos,来测试nacos的负载均衡。
3、建立父工程
父工程怎么建立,自己网上查。pom.xml文件如下
<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> </parent>--><groupId>com.suibibk.springCloud</groupId><artifactId>springCloudAlibaba</artifactId><version>0.0.1-SNAPSHOT</version><name>springCloudAlibaba</name><description>Demo project for Spring Boot</description><modules><module>order-nacos</module><module>stock-nacos</module><module>stock-nacos2</module></modules><packaging>pom</packaging><properties><java.version>1.8</java.version><spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version><spring.cloud.version>Hoxton.SR9</spring.cloud.version><spring.boot.version>2.3.2.RELEASE</spring.boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><!--springcloudalibaba版本管理--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!--springboot版本管理--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>import</scope></dependency><!--springcloud版本管理--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
上面用dependencyManagement来管理依赖,这里管理了spring-cloud-alibaba-dependencies、spring-boot-starter-parent、spring-cloud-dependencies的依赖,反正子工程想用谁的就用谁的。
上面也包含了三个子工程
<module>order-nacos</module><module>stock-nacos</module><module>stock-nacos2</module>
其实正常来说只需要一个stock-nacos,部署两个节点就可以了,这里是为了方便区别,所以拷贝了一份,因为都是本地,所以端口不同,但是注册到Nacos都是一样的。
4、order-nacos
pom.xml
<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><parent><groupId>com.suibibk.springCloud</groupId><artifactId>springCloudAlibaba</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>stock-nacos</artifactId><packaging>jar</packaging><name>stock-nacos</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--服务注册与发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies></project>
OrderController.java
package com.suibibk.springCloud.order.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;@RestController@RequestMapping("/order")public class OrderController {@AutowiredRestTemplate restTemplate;@RequestMapping("/add")public String add(){String msg = restTemplate.getForObject("http://stock-service/stock/reduce", String.class);return "新增订单成功"+msg;}}
这里的逻辑是调用stock-service服务,借用的是RestTemplate,所以配置类需要有这个bean,这里在启动类配置
OrderApplication.java
package com.suibibk.springCloud.order;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.client.RestTemplateBuilder;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;@SpringBootApplicationpublic class OrderApplication {public static void main( String[] args ) {SpringApplication.run(OrderApplication.class,args);}@Bean@LoadBalancedpublic RestTemplate restTemplate(RestTemplateBuilder builder){return builder.build();}}
application.yml配置文件
server:port: 8012spring:application:name: order-servicecloud:nacos:server-addr: 127.0.0.1:8848discovery:username: nacospassword: nacosnamespace: public
这里要配置nacos的相关信息,nacos的安装后面再说
5、stock-nacos
pom.xml
<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><parent><groupId>com.suibibk.springCloud</groupId><artifactId>springCloudAlibaba</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>stock-nacos</artifactId><packaging>jar</packaging><name>stock-nacos</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--服务注册与发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies></project>
StockController.java
package com.suibibk.springCloud.stock.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/stock")public class StockController {@RequestMapping("/reduce")public String reduce(){return "库存扣减成功";}}
启动类
StockApplication.java
package com.suibibk.springCloud.stock;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/*** Hello world!**/@SpringBootApplicationpublic class StockApplication {public static void main( String[] args ) {SpringApplication.run(StockApplication.class,args);}}
配置文件application.yml
server:port: 8013spring:application:name: stock-servicecloud:nacos:server-addr: 127.0.0.1:8848discovery:username: nacospassword: nacosnamespace: public
服务名是stock-service
这里顺便提下,stock-nacos2跟stock-nacos的区别,本质上只需要端口不同,其他都是相同的,如果是部署在不同的服务器,那么由于ip不同,所以端口也是相同的,也就是应用本身完全相同
stock-nacos2的配置
server:port: 8014spring:application:name: stock-servicecloud:nacos:server-addr: 127.0.0.1:8848discovery:username: nacospassword: nacosnamespace: public
6、安装nacos
github
https://github.com/alibaba/nacos/releases
https://github.com/alibaba/nacos/releases/tag/1.4.2
这里版本选择的是1.4.2,然后启动也是用单机的启动即可,毕竟集群也很简单,但是集群多个节点前面需要用nginx来进行负载均衡,然后服务注册里面填写的地址就是nginx的地址
启动脚本改为单机模式
set MODE="standalone"
数据库默认用内存数据库
启动成功后访问控制台
http://127.0.0.1:8848/nacos/index.html
用户密码:nacos/nacos
7、启动服务,测试
启动order-nacos、stock-nacos和stock-nacos2后,在控制台可以看到
可以看到stock-service有两个节点,然后我们访问http://127.0.0.1:8012/order/add
测试发现,轮流返回“新增订单成功库存扣减成功2”和“新增订单成功库存扣减成功”,表面负载均衡成功,默认用的是轮询。
