谷粒商城学习——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>
View Code

我降低后的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>
View Code

还要改下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
View Code

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>
View Code

并配置对应的配置

#服务名
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
View Code
#服务名
spring.application.name=gulimall-gateway
#配置中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
server.port=88
View Code

设置服务发现并排除数据库(网关模块不需要连接数据库,而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);
    }

}
View Code

设置网关路由(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
View Code

注意Query后是“=”不是“:”

nacos建对应的命名空间,启动项目,访问http://localhost:88/?url=qq和http://localhost:88/?url=baidu即可看到效果

断言有很多种@官网详细说明

原文地址:https://www.cnblogs.com/yanan7890/p/14855890.html