谷粒商城学习——P20-27springcloud alibaba
@github介绍
@spring官网
版本对应:
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
https://start.spring.io/actuator/info
Nacos注册中心
接入步骤
1引入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
2,下载安装启动注册中心服务器:nacos-server
3,项目中配置nacos-server地址和模块名
4,使用 @EnableDiscoveryClient
注解开启服务注册与发现功能
访问http://127.0.0.1:8848/nacos/,登录账号名密码默认都是nacos
Feign声明式远程调用
feign是一个声明式的HTTP客户端,整合了Ribbon(负载均衡)和Hystris(服务熔断),可以让我们不需要显示的使用这两个组件
使用步骤
1引入openfeign依赖
引入者拥有远程调用别的服务的能力
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2编写一个接口,接口告诉springcloud这个接口需要调用远程服务
package com.atguigu.gulimall.member.service; import com.atguigu.common.utils.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; /** * @Description: * @Author: zyn * @Date: 2021-6-6 */ //告诉spring cloud这个接口是一个远程客户端,要调用nacos注册中心中的服务名为gulimall-coupon的服务,对应的方法/coupon/coupon/member/list @FeignClient("gulimall-coupon") public interface CouponFeignService { //注意我们这个地方不是控制层,所以这个请求映射请求的不是我们服务器上的东西,而是nacos注册中心的 @RequestMapping("/coupon/coupon/member/list") public R membercoupons();//得到一个R对象 }
3开启远程调用功能 @EnableFeignClients
要指定需要扫码的包
注意,如果启动失败,报异常
No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?
参考这篇文章https://blog.csdn.net/weixin_43556636/article/details/110653989,将springboot版本降低,
我降低后的common
<?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"> <parent> <artifactId>gulimall</artifactId> <groupId>com.atguigu.gulimall</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR3</spring-cloud.version> </properties> <artifactId>gulimall-common</artifactId> <description>每一个微服务公众的依赖、bean、工具类等</description> <dependencies> <!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.4.1</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <!--一般tomcat都带javax.servlet-api,因此设置成provided(目标环境已存在,打包的时候就不会带上这个了)--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <!--导入mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.17</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> <!--dependencyManagement是依赖管理,相当于以后再dependencies里引spring cloud alibaba就不用写版本号, 全用dependencyManagement进行管理--> <!--注意他和普通依赖的区别,他只是备注一下,并没有加入依赖--> <dependencyManagement> <dependencies> <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> </dependencies> </dependencyManagement> </project>
我降低后的member
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall-member</artifactId> <version>0.0.1-SNAPSHOT</version> <name>gulimall-member</name> <description>谷粒商城-会员服务</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
还要改下package com.atguigu.gulimall.member等中的
import org.junit.Test;
Nacos配置中心
接入步骤
1引入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
2,创建修改bootstrap.properties文件
设置应用名字和配置中心的地址
#这个文件是springboot里规定的,优先级别application.properties高 #服务名 spring.application.name=gulimall-coupon #配置中心地址 spring.cloud.nacos.config.server-addr=127.0.0.1:8848
3,配置中心添加配置(数据集)并发布
Data Id规则:bootstrap.properties中配置的服务名加.properties
4,使用配置
@RefreshScope动态获取并刷新配置@Value("${配置项的名}")获取配置
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
%%%%%%中间一部分内容,来回修改博客弄丢了,惨痛的教训,下篇开始还是分开写。时间有限,简单补上一些%%%%%%%
#这个文件是springboot里规定的,优先级别application.properties高 #服务名 spring.application.name=gulimall-coupon #配置中心地址 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.namespace=16d6f56c-a85d-4a7a-87df-5230e4118329 spring.cloud.nacos.config.group=dev spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml spring.cloud.nacos.config.ext-config[0].group=dev #refresh是否动态刷新,默认false spring.cloud.nacos.config.ext-config[0].refresh=true spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml spring.cloud.nacos.config.ext-config[1].group=dev spring.cloud.nacos.config.ext-config[1].refresh=true spring.cloud.nacos.config.ext-config[2].data-id=others.yml spring.cloud.nacos.config.ext-config[2].group=dev spring.cloud.nacos.config.ext-config[2].refresh=true
20210624补充 重要说明:
#如果不配置应用名.properties【这个是默认加载的】,就必须配置spring.cloud.nacos.config.ext-config[0].data-id
命名空间:两个红框对应,指的就是命名空间。指定命名空间,会只加载这个命名空间下的配置
分组:对命名空间下筛选用哪些配置。不知道默认DEFAULT_GROUP
ext-config[0]的写法属于加载多配置集。可以将application.yml中的配置,根据功能分为多个小配置
网关
从请求到接口可能需要一系列的处理,如鉴权、限流、日志输出等,这一系列都可以做到gateway网关里。
@官网学习地址。GA是稳定发布版。我找到了视频中的2.1.3的文档
Route路由
发一个请求给网关,网关要将请求路由到指定的服务。路由内包含路由id,目的地uri,断言,过滤器。匹配了断言就能到达指定位置
Predicate断言:
就是java里的断言函数,匹配请求里的任何信息,包括请求头等。根据请求头路由哪个服务
示例:输入qq和baidu跳到对应网页
新建gulimall-gateway模块,配置上common(含配置中心和注册中心)
配置gateway依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
并配置对应的配置
#服务名 spring.application.name=gulimall-gateway #配置中心地址 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.namespace=222b8f1f-6cab-4968-ace0-a5b4fed80694
#服务名 spring.application.name=gulimall-gateway #配置中心地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 server.port=88
设置服务发现并排除数据库(网关模块不需要连接数据库,而common中含有连接依赖)
package com.atguigu.gulimall.gateway; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class GulimallGatewayApplication { public static void main(String[] args) { SpringApplication.run(GulimallGatewayApplication.class, args); } }
设置网关路由(id、uri和断言)
spring: cloud: gateway: routes: - id: test_routes uri: https://www.baidu.com predicates: - Query= url,baidu - id: test_routes2 uri: https://www.qq.com predicates: - Query=url,qq
注意Query后是“=”不是“:”
nacos建对应的命名空间,启动项目,访问http://localhost:88/?url=qq和http://localhost:88/?url=baidu即可看到效果
断言有很多种@官网详细说明
本文来自博客园,作者:每天都要学一点,欢迎讨论和转载,转载请注明原文链接:https://www.cnblogs.com/yanan7890/p/14855890.html