上一篇博客我们对SpringCloud有了一个详细的描述,这一次我们根据上次的理念来一个落地实现。
本次只是一个简单的集成(内容实在是太多了),后面会把每一部分单独出一个博客详细解释,但都是基于此服务
SpringCloud微服务详解(springcloud alibaba)
本篇博客的架构图如下
文章目录
一、前期准备
1-1、创建一个父工程
后面直接next、finish就可以了。
1-2、创建公共pom
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>www.xdx97.cloud</groupId>
<artifactId>xdxCloud</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!-- 统一管理jar包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<lombok.version>1.16.18</lombok.version>
<mysql.version>5.1.47</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
</properties>
<!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version -->
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
二、创建一个服务提供方(用户服务)
以后所有的创建方式都是如此
2-1、创建项目
2-2、修改pom
<dependencies>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2-3、新增yml配置文件
server:
port: 5001
spring:
application:
name: user_server_5001
2-4、新增启动类文件
package com.xdx97;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class UserServer5001 {
public static void main(String[] args) {
SpringApplication.run(UserServer5001.class, args);
}
}
2-5、新增用户服务
package com.xdx97.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/user")
public String fun(){
return "我是用户服务";
}
}
2-6、测试
在浏览器访问( http://127.0.0.1:5001/user ),如果可以看到结果及表示成功。
三、注册中心(nacos)
目前就用window版本,后面会出nacos集群那时候再用linux版本
3-1、下载
https://github.com/alibaba/nacos/releases
3-2、启动
- 把下载好的包,解压出来
- 打开CMD去到bin目录下,执行 startup.cmd -m standalone (standalone代表着单机模式运行,非集群模式)
- 打开浏览器输入:http://127.0.0.1:8848/nacos/index.htm ,看到如下界面表示成功。
- 初始用户名/密码 nacos/nacos
3-3、用户服务注册进nacos
- 修改user服务的pom文件,加入下面的依赖
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 修改yum文件为如下内容
server:
port: 5001
spring:
application:
name: user_server_5001
cloud:
nacos:
discovery:
#server-addr: localhost:8848 #配置Nacos地址
server-addr: 127.0.0.1:8848
- 在启动类上面加上服务发现注解
@EnableDiscoveryClient
- 重启服务,然后刷新nacos会发现已经注册进去了
四、网关 (getway)
网关里面是已经集成了服务调用负载均衡的
4-1、参照二、建立一个模块 (getway6001)
4-2、添加yml文件
这里面有一个坑,我前面的用户服务取名为user_server_5001,这个名字配置在网关里面无法识别,所以我改成了userServer
server:
port: 6001
spring:
application:
name: getway_6001
cloud:
nacos:
discovery:
#server-addr: localhost:8848 #配置Nacos地址
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: user_server #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:5001 #匹配后提供服务的路由地址
uri: lb://userServer #配置nacos里面的服务名
predicates:
- Path=/user/** # 断言,路径相匹配的进行路由
4-3、配置pom
<dependencies>
<!--gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
4-4、配置启动类
@SpringBootApplication
@EnableDiscoveryClient
public class Getway6001 {
public static void main(String[] args) {
SpringApplication.run(Getway6001.class, args);
}
}
4-5、测试
在浏览器输入 http://localhost:6001/user 如果可以成功访问,表示成功。
4-6、其它
本以为网关就是一个转发,但是刚刚测试发现还有其它好玩的东西,但是博客写的太长不好,而且这篇博客就是简单搭建微服务,后面会单独写一篇文章。
五、配置中心(nacos)
为用户服务添加配置中心,以便可以动态的更新配置文件
5-1、添加pom
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
5-2、修改配置文件
5-2-1、bootstrap.yml
我们需要新增一个bootstrap.yml文件,在读取顺序的时候bootstrap.yml是优先于application.yml。
server:
port: 5001
spring:
application:
name: userServer
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
5-2-2、application.yml
spring:
profiles:
active: dev
5-3、添加nacos配置
5-4、配置动态刷新效果
这里很关键,不可能说当我们去修改了nacos里面的配置文件,然后我们的系统代码立即就收到的,他是有一个过程的。
我们要把全部的配置文件写到一个java文件里面,然后别的地方要用的时候去调用就好了,比如下面的用法:ConfigController.wxApp;
package com.xdx97.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/user")
public String fun(){
return "我是用户服务" + ConfigController.wxApp;
}
}
我们来配置这个ConfigController,使他里面的都可以动态获取,我这里只配置一个属性(wx.app)作为演示,具体数量看实际需求。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RefreshScope
@RestController
public class ConfigController {
@RequestMapping("/refreshConfig")
public String refreshConfig(){
return "配置刷新成功";
}
public static String wxApp;
@Value("${wx.app}")
public void setWxApp(String wxApp) {
this.wxApp = wxApp;
}
}
5-5、最终效果演示
六、服务监控(sentinel)
6-1、sentinal 控制台
6-1-1、下载
https://github.com/alibaba/Sentinel/releases
下载后启动, java -jar sentinel-dashboard-1.8.1.jar
6-1-2、登录
访问 http://127.0.0.1:8080 , 用户名/密码 sentinel / sentinel
6-2、userServer集成sentinel
6-2-1、添加如下pom
<!--SpringCloud ailibaba sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
6-2-2、修改配置文件(bootstrap.yml)
server:
port: 5001
spring:
application:
name: userServer
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
sentinel:
transport:
dashboard: localhost:8080
port: 8719
6-2-3、userServer注册进sentinal
我们的sentinel是懒加载的,我们重启userServer服务,然后访问 http://127.0.0.1:5001/user,再刷新sentinel就可以看到如下内容
6-2-4、服务限流
sentinal 可以提供各个维度不同的限流,这里我只测试一个最简单的流程:当QPS大于1的时候快速失败
七、Nginx负载
八、源代码/安装包 获取
关注微信公众号回复: SpringCloudAlibabaDemo