• 谷粒商城学习——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即可看到效果

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

  • 相关阅读:
    redis集群方式
    缓存数据库redis相关问题
    mybatis中如何进行多表关联查询
    mabaits出现parma不匹配时 或者参数>number 4 ,解决方法。
    El表达式
    Jsp概述
    Session会话技术
    springMVC之DateSource提示com.mysql.jdbc.Driver找不到
    Oracle查询死锁
    Mybatis 向oracle批量插入与更新数据
  • 原文地址:https://www.cnblogs.com/yanan7890/p/14855890.html
Copyright © 2020-2023  润新知