idea 搭建springcloud+springcloud alibaba项目
版本:
jdk:1.8
springcloud alibaba:2.2.1
springboot:2.2.5
springcloud:Hoxton.SR6
个人总结:
(1)首先是服务注册中心以及配置中心(Nacos)
(2)服务注册
(3)openfeign组件实现服务调用(集成了Ribbon,故负载均衡)
(4)gateway网关(实现了统一调用):路由转发,过滤
(5)sentinel流量哨兵(监控整个微服务,从流量控制,熔断降级,系统负载等多个维度保护服务)
1.新建无骨架的maven项目作为父项目
删掉src文件目录并引入依赖:
<!--集成springboot父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
<spring.cloud.version>Hoxton.SR6</spring.cloud.version>
</properties>
<!--全局引入下载依赖地址,并不会引入依赖-->
<dependencyManagement>
<dependencies>
<!--阿里巴巴下载仓库-->
<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>
<!--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>
然后新建一个Module:commons,以后主要是放置公共实体类以及公共工具类以及公共依赖,所以不需要启动类,以及test
然后根据上面的方式在随意建两个module,这里一个user,一个product
然后公共类引入Nacos注册发现依赖 以及 springboot的web依赖,两个新建的module引入commons
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos client-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
然后以用户服务为例(三部曲:引依赖,写配置文件,写启动类):
依赖就是上面引的commons。
创建resource文件夹以及application.properties文件并写入配置
server.port=6666
spring.application.name=clouduser
spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
management.endpoints.web.exposure.include=*
写启动类并运行,product服务同上(如果报错,clean/install一下父工程):
成功注册到Nacos服务中心
三:引入openfeign实现服务调用(服务可以互相调用,所以依赖可以加在公共服务里)
以user服务为例
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
入口类加入@EnableFeignClients注解
product服务写个接口:
user服务添加新建个clients包,用来存放服务调用接口
然后写user服务接口调用product服务的接口:
运行:Error:(3,43) java: 程序包org.springframework.cloud.openfeign不存在(报错的话clean/install一下commons服务)
然后复制一个product服务测试负载均衡(这个方法上篇讲过)
访问:
刷新:
实现负载均衡
接下来先实现流量卫兵的监控
公共依赖引入依赖:
<!--sentinel依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
然后配置user,product服务的配置文件
spring.cloud.sentinel.enabled=true
spring.cloud.sentinel.transport.dashboard=localhost:xxxx //这个xxxx是自己的端口号
spring.cloud.sentinel.transport.port=8719
先看下sentinel,暂时没有对应的服务
然后运行一下各自的接口,在看sentinel就有了(这里application配置文件没有配置spring.cloud.sentinel.eager=true
(这个就是代表立即加在到sentinel就不需要访问一下对应的接口才能检测到))
哨兵监控完成
然后就是管理配置文件(统一配置管理中心):
commons引入依赖
<!--(nacos统一配置中心管理依赖)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
然后nacos新建一个生产命名空间:
然后去生产环境中配置:
然后修改user服务的properties文件为bootstrap
spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
#这是上面环境下的唯一标识
spring.cloud.nacos.config.namespace=732f14fe-5d92-4d02-a276-340d9398b3d8
#这是分组
spring.cloud.nacos.config.group=CLOUDALI
#这三个合起来就是data id
spring.application.name=clouduser
spring.profiles.active=prod
spring.cloud.nacos.config.file-extension=properties
运行
成功
接下来是gateway:
新建一个module(cloud-server)并引入依赖(mvc的web依赖跟gateway依赖冲突,所以gateway依赖自己单独引入):
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--gateway依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--sentinel依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--(nacos统一配置中心管理依赖)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
然后新建resoure文件夹,配置文件需要写成yml格式:
server:
port: 7666
spring:
application:
name: gateway
cloud:
nacos:
config:
server-addr: localhost:8848
discovery:
service-name: ${spring.application.name}
gateway:
routes:
- id: user-route #指定唯一标识
# uri: http://localhost:6666/ #指定路由服务的地址
uri: lb://clouduser #服务名,实现负载均衡
predicates:
- Path=/user/** #指定路由规则
- id: product-route #指定唯一标识
# uri: http://localhost:6667/ #指定路由服务的地址
uri: lb://cloudproduct # lb:服务名,实现负载均衡
predicates:
- Path=/product/** #指定路由规则
discovery:
locator:
enabled: true #开启动态服务名动态获取路由地址
management:
endpoints:
web:
exposure:
include: "*" #暴露路由的规则端点 /actuator/gateway/routes
然后新建启动类:
启动
访问:
处理格式异常:
通过gateway访问商品服务:
刷新:
负载均衡
通过gateway访问user服务,user服务调用的product服务
刷新:
成功
最后,查看路由规则:
这里配置了路由暴露规则端点:
引入依赖:
重启:访问:http://localhost:7666/actuator/gateway/routes