上一篇博客我们对SpringCloud有了一个详细的描述,这一次我们根据上次的理念来一个落地实现。
本次只是一个简单的集成(内容实在是太多了),后面会把每一部分单独出一个博客详细解释,但都是基于此服务
SpringCloud微服务详解(springcloud alibaba)
后面直接next、finish就可以了。
<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.0modelVersion>
<groupId>www.xdx97.cloudgroupId>
<artifactId>xdxCloudartifactId>
<packaging>pompackaging>
<version>1.0-SNAPSHOTversion>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<junit.version>4.12junit.version>
<mysql.version>5.1.47mysql.version>
<druid.version>1.1.16druid.version>
<mybatis.spring.boot.version>1.3.0mybatis.spring.boot.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>2.2.2.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Hoxton.SR1version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.1.0.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>${mysql.version}version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>${druid.version}version>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>${mybatis.spring.boot.version}version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${lombok.version}version>
<optional>trueoptional>
dependency>
dependencies>
dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<fork>truefork>
<addResources>trueaddResources>
configuration>
plugin>
plugins>
build>
project>
以后所有的创建方式都是如此
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
server:
port: 5001
spring:
application:
name: user_server_5001
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);
}
}
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 "我是用户服务";
}
}
在浏览器访问( http://127.0.0.1:5001/user ),如果可以看到结果及表示成功。
目前就用window版本,后面会出nacos集群那时候再用linux版本
https://github.com/alibaba/nacos/releases
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
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
网关里面是已经集成了服务调用负载均衡的
这里面有一个坑,我前面的用户服务取名为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/** # 断言,路径相匹配的进行路由
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
@SpringBootApplication
@EnableDiscoveryClient
public class Getway6001 {
public static void main(String[] args) {
SpringApplication.run(Getway6001.class, args);
}
}
在浏览器输入 http://localhost:6001/user 如果可以成功访问,表示成功。
本以为网关就是一个转发,但是刚刚测试发现还有其它好玩的东西,但是博客写的太长不好,而且这篇博客就是简单搭建微服务,后面会单独写一篇文章。
为用户服务添加配置中心,以便可以动态的更新配置文件
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
我们需要新增一个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格式的配置
spring:
profiles:
active: dev
这里很关键,不可能说当我们去修改了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;
}
}
https://github.com/alibaba/Sentinel/releases
下载后启动, java -jar sentinel-dashboard-1.8.1.jar
访问 http://127.0.0.1:8080 , 用户名/密码 sentinel / sentinel
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
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
我们的sentinel是懒加载的,我们重启userServer服务,然后访问 http://127.0.0.1:5001/user,再刷新sentinel就可以看到如下内容
sentinal 可以提供各个维度不同的限流,这里我只测试一个最简单的流程:当QPS大于1的时候快速失败
Nginx实现负载均衡Linux版本(六种负载策略)
关注微信公众号回复: SpringCloudAlibabaDemo