1 登录进入到后台管理界面
2 集成springcloudalibaba的注册中心
(1)docker下安装nacos
docker pull nacos/nacos-server:1.2.0
查看docker镜像
docker images
生成nacos启动容器
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server:1.2.0
把腾讯云8848端口打开
访问 ip:8848/nacos
(2)项目集成Nacos
springboot-springcloud-springcloud alibaba 版本对应关系如下(避免包冲突)
我们springboot使用2.6.3,springcloud使用springcloud 2021.0.1
springcloud alibaba使用2021.0.1.0
在gulimall-common工程的pom.xml中引入nacos依赖
<!--nacos-discovery--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
在每个工程的application.yml中,指定nacos配置,指定端口号,指定服务名
spring.cloud.nacos.discovery.server-addr=124.223.118.207:8848 spring.application.name=gulimall-XXX
在每个工程的启动类上,添加@EnableDiscoveryClient注解
启动各个服务,打开nacos看一下配置
3 集成springcloud-alibaba-openfeign 远程调用
服务之间互相调用(openfeign )
例如:member服务调用coupon服务
1. 在CouponController中,提供一个接口“查询会员下拥有的优惠劵”
2 在member服务中
1) pom.xml中加入openfeign(每一个服务都添加一下feign组件)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2)新建com.gulimall.member.feign.CouponFeignService
package com.gulimall.member.feign;
import com.gulimall.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 优惠券远程调用
*
* @author gaorimao
* @date 2022/03/15
*/
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/coupons")
public R list();
}
3) 启动类开启feign功能
@EnableFeignClients(basePackages = "com.gulimall.member.feign")
4)在MemberController写一个接口测试下
postman测试下
远程调用演示结束。
4 集成springcloud-alibaba-config 配置中心
在common工程中引入config依赖
<!-- 配置中心来做配置管理--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
新建bootstrap.properties(优先级最高)配置“配置中心”
spring.application.name=gulimall-coupon spring.cloud.nacos.config.server-addr=124.223.118.207:8848
在nacos的配置中心新建配置gulimall-coupon.properties
在CouponController中获取name和age,进行测试
1)CouponController上加上@RefreshScope注解(刷新配置)
2)新建一个接口
重启gulimall-coupon服务,进行测试
不需要重启gulimall-coupon服务,只需要修改一下配置中心的name和age,重新调用接口
调用接口,结果如下,配置中心测试已OK
接下来,给每个工程都集成config配置中心,让配置文件集中管理
思路:每个工程都有自己的命名空间(namespace),每个环境都是不同分组(group)
gulimall-coupon
bootstrap.properties
spring.application.name=gulimall-coupon spring.cloud.nacos.config.server-addr=124.223.118.207:8848 spring.cloud.nacos.config.namespace=fb0557b0-b2d0-4abf-ba70-a7094962941b spring.cloud.nacos.config.group=dev
类似的,配置下其他服务(略)
5 集成springcloud-alibaba-gateway 网关
把以前生成的vue代码,拷贝在src/views下
启动后台商品服务(ProductApp)随便访问一个菜单:“分类维护”
前端访问的地址如下:
http://localhost:8080/renren-fast/product/category/list?t=1646987297710&page=1&limit=10&key=
后台的真实地址实际如下:
http://localhost:9001/product/category/list?t=1646987127895&page=1&limit=10&key=
我们采用的是springcloud gateway进行路由转发,它为springcloud官方推出的第二代网关框架,取代了zuul网关。
新建一个子工程gulimall-gateway,加入nacos注册中心,加入config配置中心
引入gateway依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> <!--springcloudgateway的内部是通过netty+webflux实现的,webflux实现和springmvc配置依赖冲突--> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </exclusion> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </exclusion> </exclusions> </dependency>
添加gateway跨域配置
package com.gulimall.gateway.config;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
/**
* gulimall跨域配置
*
* @author gaorimao
* @date 2022/03/15
*/
public class GulimallCorsConfiguration {
@Bean
public CorsWebFilter corsWebFilter(){
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
//1、配置跨域
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.setAllowCredentials(true);
source.registerCorsConfiguration("/**",corsConfiguration);
return new CorsWebFilter(source);
}
}
添加gateway配置
spring:
gateway:
routes:- id: product_route
uri: lb://gulimall-product
predicates:
- Path=/api/product/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}- id: third_party_route
uri: lb://gulimall-third-party
predicates:
- Path=/api/thirdparty/**
filters:
- RewritePath=/api/thirdparty/(?<segment>.*),/$\{segment}- id: member_route
uri: lb://gulimall-member
predicates:
- Path=/api/member/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}- id: ware_route
uri: lb://gulimall-ware
predicates:
- Path=/api/ware/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}- id: admin_route
uri: lb://renren-fast
predicates:
- Path=/api/**
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}
http://localhost:8080/renren-fast/product/category/list?t=1646987297710&page=1&limit=10&key=
转发到
http://localhost:9001/product/category/list?t=1646987127895&page=1&limit=10&key=