【Gulimall】Spring Cloud:spring-cloud-gateway、spring-cloud-openfeign,Alibaba的注册+配置中心Nacos
文章目录
- 1 Nacos
- 1.0安装
- 1.1注册中心
- 1.2配置中心
- 2 spring-cloud-openfeign
- 3 spring-cloud-gateway
Spring Cloud官方 link + Github link
这里gulimall-common这是一个公共模块maven工程(添加共有依赖),别的几个都是springboot工程提供微服务
依赖管理:相当于以后再dependencies里引spring cloud alibaba、spring cloud就不用写版本号
spring cloud alibaba:在pom中dependencyManagement 中添加如下配置。然后在 dependencies 中添加自己所需使用的依赖即可使用。
<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.3.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
spring cloud alibaba与spring boot的版本对应
Spring Cloud相关微服务时是的dependencyManagement
<properties><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR9</spring-cloud.version></properties><dependencyManagement><dependencies><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>
1 Nacos
1.0安装
下载github的release文件工具:link
验证是否启动成功的网址:http://localhost:8848/nacos/index.html
用户名默认:nacos,密码:nacos
之前遇到这么个问题
startup.sh中将JAVA_HOME修改为jdk的路径,下面三行屏蔽
1.1注册中心
1.首先,修改 pom.xml 文件,引入 Nacos Discovery Starter。
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
2.在应用的 /src/main/resources/application.yml 配置文件中配置 Nacos Server 应用名称和地址 PS:就统一不在application.properties里配置了,一样的。
spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848application:name: gulimall-product
3.使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
@MapperScan("com.atguigu.gulimall.product.dao") //扫描Dao操作的@Mapper加入IOC
@SpringBootApplication
@EnableDiscoveryClient //注册
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign") //使能远程调用Feign
public class GulimallProductApplication {public static void main(String[] args) {SpringApplication.run(GulimallProductApplication.class, args);}
}
务必保证所有服务都注册到Nacos(公共模块gulimall-common就算了),否则无法远程调用和进行网关lb(load balance)
1.2配置中心
1.首先,修改 pom.xml 文件,引入 Nacos Config Starter。
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
2.在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据
spring.application.name=gulimall-product
spring.cloud.nacos.config.server-addr=127.0.0.1:8848spring.cloud.nacos.config.namespace=0033369e-90ec-4da9-9db7-6e9db55f50da #指定命名空间,默认为public
spring.cloud.nacos.config.group=prod #指定分组
spring.cloud.nacos.config.refresh-enabled=true #更改配置后自动刷新,不用重启应用#多个配置文件方式
#spring.cloud.nacos.config.extension-configs[0].data-id=oss.yml
#spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
#spring.cloud.nacos.config.extension-configs[0].refresh=true
#spring.cloud.nacos.config.extension-configs[1].data-id=xxx.yml
#spring.cloud.nacos.config.extension-configs[1].group=dev
#spring.cloud.nacos.config.extension-configs[1].refresh=true
3.完成上述两步后,应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 Property Sources 中
4.动态获取配置。@RefreshScope:动态获取并刷新配置,这里我们使用 @Value("${配置项的名}")注解来将对应的配置注入到字段
(如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置。)
@RefreshScope
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {@Value("${coupon.user.name}")private String name;@Value("${coupon.user.age}")private Integer age;....
}
Nacos作为配置中心时:红框中新建命名空间,篮框+新建配置文件(可指定分组)
PS:项目中的使用:每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod
2 spring-cloud-openfeign
feign是一个声明式的HTTP客户端,他的目的就是让远程调用更加简单。给远程服务发的是HTTP请求。
想要远程调用的步骤:
1 在pom中引入openfeign(需要spring cloud的依赖管理)
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
2 编写一个接口,接口告诉springcloud这个接口需要调用远程服务
- 2.1 在接口里声明@FeignClient(“gulimall-coupon”)他是一个远程调用客户端且要调用coupon服务
@FeignClient("gulimall-coupon")
public interface CouponFeignService { //注意这个是接口/*** 1、CouponFeignService.saveSpuBounds(spuBoundTo);* 1)、@RequestBody将这个对象转为json。* 2)、找到gulimall-coupon服务,给/coupon/spubounds/save发送请求。* 将上一步转的json放在请求体位置,发送请求;* 3)、对方服务收到请求。请求体里有json数据。* (@RequestBody SpuBoundsEntity spuBounds);将请求体的json转为SpuBoundsEntity;* 只要json数据模型是兼容的。双方服务无需使用同一个to* @param spuBoundTo* @return*/@PostMapping("/coupon/spubounds/save") //直接让后台指定服务处理 //让所有请求过网关则 @PostMapping("/api/coupon/spubounds/save")R saveSpuBounds(@RequestBody SpuBoundTo spuBoundTo);@PostMapping("/coupon/skufullreduction/saveinfo")R saveSkuReduction(@RequestBody SkuReductionTo skuReductionTo);
}
- 2.2 要调用coupon服务的/coupon/spubounds/save和/coupon/skufullreduction/saveinfo方法
// /coupon/spubounds/save@PostMapping("/save")//@RequiresPermissions("coupon:spubounds:save")public R save(@RequestBody SpuBoundsEntity spuBounds){spuBoundsService.save(spuBounds);return R.ok();}// /coupon/skufullreduction/saveinfo@PostMapping("/saveinfo")public R saveInfo(@RequestBody SkuReductionTo reductionTo){skuFullReductionService.saveSkuReduction(reductionTo);return R.ok();}
3 开启远程调用功能 @EnableFeignClients,要指定远程调用功能放的基础包
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign")
@EnableDiscoveryClient
@MapperScan("com.atguigu.gulimall.product.dao")
@SpringBootApplication
public class GulimallProductApplication {public static void main(String[] args) {SpringApplication.run(GulimallProductApplication.class, args);}
}
4 本服务如何远程调用
@Autowired CouponFeignService couponFeignService; //注入R r = couponFeignService.saveSpuBounds(spuBoundTo);if (r.getCode() != 0) {log.error("远程保存spu积分失败");}
3 spring-cloud-gateway
三大核心概念:
- Route: The basic building block of the gateway. It is defined by an ID, a destination URI, a collection of predicates断言, and a collection of filters. A route is matched if the aggregate predicate is true.发一个请求给网关,网关要将请求路由到指定的服务。路由有id,目的地uri,断言的集合,匹配了断言就能到达指定位置,
- Predicate断言: This is a Java 8 Function Predicate. The input type is a Spring Framework ServerWebExchange. This lets you match on anything from the HTTP request, such as headers or parameters.就是java里的断言函数,匹配请求里的任何信息,包括请求头等
- Filter: These are instances of Spring Framework GatewayFilter that have been constructed with a specific factory. Here, you can modify requests and responses before or after sending the downstream request.过滤器请求和响应都可以被修改。
在pom中配置依赖(需要spring cloud的依赖管理):
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
注:只有服务注册了,才可以通过网关发现该服务,同时网关服务也需要注册进Nacos
在application.yml中进行网关的路由配置的时候,是有顺序的,小范围的predicates在前面,要不会被拦截走
spring:cloud:gateway:routes:- id: product_routeuri: lb://gulimall-product # lb(load balance)代表从注册中心获取注册名为gulimall-product服务 predicates:- Path=/api/product/**filters:- RewritePath=/api/(?<segment>.*),/$\{segment} #即去掉/api- id: admin_routeuri: lb://renren-fastpredicates:- Path=/api/**filters:- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}
在启动gulimall-gateway服务时,问题如下:
问题分析:由于公共依赖中有mybatis-plus配置(需要相应的datasource),而网关不需要mybatis-plus,所以启动时得手动排除下
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
方式二:
在pom中给依赖给排除下
<dependency><groupId>com.atguigu.gulimall</groupId><artifactId>gulimall-common</artifactId><version>1.0-SNAPSHOT</version><exclusions><exclusion><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></exclusion></exclusions></dependency>
起初我用的是6666端口启动的,然而。。。看样没法飞起了
SOLVE:application.yml中换个端口
server:port: 6060
注意网关的pom中别引入start-web依赖,要不会引起下面的错误.
**************************
APPLICATION FAILED TO START
***************************Description:Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.gateway.config.GatewayAutoConfiguration required a bean of type 'org.springframework.http.codec.ServerCodecConfigurer' that could not be found.Action:Consider defining a bean of type 'org.springframework.http.codec.ServerCodecConfigurer' in your configuration.
【Gulimall】Spring Cloud:spring-cloud-gateway、spring-cloud-openfeign,Alibaba的注册+配置中心Nacos相关推荐
- 6.SpringCloud -- 注册中心与配置中心 Nacos、网关 Gateway
6.SpringCloud -- 注册中心与配置中心 Nacos.网关 Gateway 一.了解一下 SpringCloud Alibaba 1.1 SpringCloudAlibaba (1)简单说 ...
- spring cloud 入门系列七:基于Git存储的分布式配置中心--Spring Cloud Config
我们前面接触到的spring cloud组件都是基于Netflix的组件进行实现的,这次我们来看下spring cloud 团队自己创建的一个全新项目:Spring Cloud Config. 它用来 ...
- 五Spring Cloud Alibaba基于Nacos构建分布式配置中心
1.什么是Nacos 以下部分解释摘自于Nacos官方文档: Nacos 致力于帮助您发现.配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据 ...
- Spring Cloud(八)高可用的分布式配置中心 Spring Cloud Config
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud config,它支持配 ...
- Spring Cloud构建微服务架构(四)分布式配置中心
Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持.配置服务器为各应用的所有环境提供了一个中心化的外部配置.它实现了对服务端和客户端对Spring Environm ...
- spring boot配置ip_Spring Cloud 配置中心高可用搭建
本文通过config server连接git仓库来实现配置中心,除了git还可以使用svn或者系统本地目录都行. 引入依赖 <dependencies><dependency> ...
- Spring Cloud Config 配置中心实践过程中,你需要了解这些细节!
本文导读: Spring Cloud Config 基本概念 Spring Cloud Config 客户端加载流程 Spring Cloud Config 基于消息总线配置 Spring Cloud ...
- Spring Boot + Spring Cloud 实现权限管理系统 配置中心(Config、Bus)
技术背景 如今微服务架构盛行,在分布式系统中,项目日益庞大,子项目日益增多,每个项目都散落着各种配置文件,且随着服务的增加而不断增多.此时,往往某一个基础服务信息变更,都会导致一系列服务的更新和重启, ...
- Spring Cloud 系列之 Nacos 配置中心
目录 一.Nacos简介 二.Nacos安装及配置 1.环境准备 2.安装包下载 (1)源码方式 (2)发行包方式 3.启动Nacos服务 4.Nacos数据库配置 (1)MySQL数据源 (2)初始 ...
最新文章
- FPGA设计心得(1)真双口RAM使用及其仿真问题记录
- 粒子群PSO优化算法学习笔记 及其python实现(附讲解如何使用python语言sko.PSO工具包)
- pythonset是什么类型的游戏_Python集合(set)类型的操作
- python名称与作用域_Python变量命名与作用域的坑
- C语言栈实现逆波兰算法
- Linux下 -bash: php: command not found 命令找不到
- Spring Boot 返回 XML 数据,一分钟搞定!
- dsp2812 linux开发板,dsp2812开发板自制编程流程
- SpringBoot整合JWT(二)
- Arcgis重采样时分辨率的设置
- hdu 4565(推公式、矩阵快速幂)
- 数据中心的铜缆布线活力无限不过时
- 计算机图形学 opengl版本 第三版------胡事民 第三章更多的绘图工具
- 科罗拉多州立大学计算机科学,科罗拉多州立大学的世界排名
- SpringMVC导入Excel文件到MySQL
- 几个主流的Java连接池
- Internet Download Manager2022中文版免费下载
- 详解printf(各种打印的格式)
- 《博弈论》欧几里德的游戏
- Ubuntu菜鸟入门(十五)—— 安装aras2下载软件