从今天起简单的学习下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 {
@Autowired
RestTemplate 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;
@SpringBootApplication
public class OrderApplication {
public static void main( String[] args ) {
SpringApplication.run(OrderApplication.class,args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder builder){
return builder.build();
}
}
application.yml配置文件
server:
port: 8012
spring:
application:
name: order-service
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
username: nacos
password: nacos
namespace: 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!
*
*/
@SpringBootApplication
public class StockApplication {
public static void main( String[] args ) {
SpringApplication.run(StockApplication.class,args);
}
}
配置文件application.yml
server:
port: 8013
spring:
application:
name: stock-service
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
username: nacos
password: nacos
namespace: public
服务名是stock-service
这里顺便提下,stock-nacos2跟stock-nacos的区别,本质上只需要端口不同,其他都是相同的,如果是部署在不同的服务器,那么由于ip不同,所以端口也是相同的,也就是应用本身完全相同
stock-nacos2的配置
server:
port: 8014
spring:
application:
name: stock-service
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
username: nacos
password: nacos
namespace: 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”和“新增订单成功库存扣减成功”,表面负载均衡成功,默认用的是轮询。