spring cloud alibaba 入门学习

  • Nacos搭建
  • 下载、安装、配置
  • 1.git下载地址
  • 2.根目录下打包安装(请在cmd下运行,Powershell各种问题)
  • 3.进入 distribution/bin 启动
  • 4.启动完成,登录
  • 5. Naco动态配置(此部分建议跳过,配置中心我是在Sentinel调试后改动了配置文件及pom)
  • 服务提供者
  • 1.创建父工程
  • 2.创建服务提供者(即子module,这里我创建两个Provider1: 8700、Provider2: 8800,下main示例1)
  • 创建消费者
  • OpenFeign注意问题
  • 1.所需依赖注入不进去的手动处理办法
  • 2.调用超时问题处理
  • Sentinel的简单使用
  • Spring Cloud GateWay
  • 1.父工程依赖jar,注意GateWay中含有start-web 会与外层引入的冲突
  • 2. 新建网关项目Module(略)
  • 3.配置
  • 4.展示:即通过网关规则直接访问到其他微服务


Nacos搭建

作用:服务注册、服务发现、配置中心
环境:window 10

下载、安装、配置

1.git下载地址


2.根目录下打包安装(请在cmd下运行,Powershell各种问题)

mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring cloud alibaba


成功了

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_ide_02

3.进入 distribution/bin 启动

进入到此目录 /distribution/target/nacos-server-2.0.2/nacos/bin

在此目录下cmd打开命令窗口
windows系统下执行: cmd startup.cmd -m standalone(注意有坑,1.如果此命令无效,直接输入startup.cmd -m standalone,2,此命令为单机模式启动,如果直接双击文件启动可能会报错)
Lunix系统下执行: sh startup.sh -m standalone

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring cloud alibaba_03

4.启动完成,登录

启动完毕后:http://localhost:8848/nacos 可直接进去Nacos登录界面(账号密码皆为:nacos)

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_04

5. Naco动态配置(此部分建议跳过,配置中心我是在Sentinel调试后改动了配置文件及pom)

注意1:jar 引入

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

注意2:配置中新选择常用的Data ID 配置格式,有yaml 和properties。 特别注意java项目优先运行的文件是bootstrap.yml 或 bootstrap.yml, 用application.yml 我是怎么也获取不到动态配置的,于是直接将application.yml更名为bootstrap.yml完美解决

注意3:Data ID 命名要求严格,项目名-环境.后缀名 (环境没有区分可以省略,配置不对是个坑)
官方说明 https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_05

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_06


spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_07

下图为sentinel完成调试后的图,已标记重点

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring_08

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring cloud alibaba_09

Nacos 搭建完成,接下来需要服务提供者

服务提供者

1.创建父工程

  1. 新建文件夹spring-cloud-alibaba
  2. IDEA打开文件夹,文件夹下创建pom.xml,注意加入maven项目管理

一定要主要版本搭配,不然会报错。具体参考此链接,也有配置,依赖相关的文档:
https://github.com/alibaba/spring-cloud-alibaba#version-control-guidelines

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zpa.alibaba</groupId>
    <artifactId>spring-cloud-alibaba</artifactId>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>alibaba-provider2</module>
        <module>alibaba-provider1</module>
    </modules>

    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR8</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.5.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
            <version>0.9.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.2</version>
            <optional>true</optional>
        </dependency>
    </dependencies>

</project>

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring_10


spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_11

2.创建服务提供者(即子module,这里我创建两个Provider1: 8700、Provider2: 8800,下main示例1)

1,在spring-cloud-alibaba文件下新建—>Module—>Maven—>创建项目alibaba-provider1
2,pom.xml中无需导入依赖。

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring cloud alibaba_12


3, 在java目录下新建项目包com.lhc.alibaba,在包目录下新建项目的启动类。

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring_13

4, 在resources目录下新建application.yml配置文件
5,如配置文件不是小绿叶图标,File–>Project Structure–>Module–>,,,输入application搜索添加即可

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring_14

6,在配置中导入配置文件内容

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_ide_15

7,启动项目,然后在Nacos注册中心下服务列表下可查看是否已注册。

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_ide_16

8.Nacos 查看服务注册

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_17

9.写测试方法用于消费者调试

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_18

创建消费者

1.父工程添加消费者 openfeign 依赖(创建父工程时应该已添加了)

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring cloud alibaba_19

2.在spring-cloud-alibaba文件下新建—>Module—>Maven—>创建项目alibaba-consumer1
3,java目录下创建Consumer1Application启动类,添加@EnableFeignClients注解

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_ide_20

4.在resources目录下新建application.yml配置文件

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_21

5,创建service接口

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_ide_22

6.,创建controller接口

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_23

7.访问http://localhost:8701/hello接口(访问正常,消费者常见完毕,此处可理解:生产者为消费者接口调用时的实现)

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_24

OpenFeign注意问题

1.所需依赖注入不进去的手动处理办法

异常如下

Caused by: feign.codec.DecodeException: No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at feign.AsyncResponseHandler.decode(AsyncResponseHandler.java:119)
	at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:87)
	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138)
	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89)
	at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:109)
	at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
	at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)
	... 26 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1717)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1273)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory$DependencyObjectProvider.getObject(DefaultListableBeanFactory.java:1906)
	at org.springframework.cloud.openfeign.support.SpringDecoder.decode(SpringDecoder.java:57)
	at org.springframework.cloud.openfeign.support.ResponseEntityDecoder.decode(ResponseEntityDecoder.java:62)
	at feign.optionals.OptionalDecoder.decode(OptionalDecoder.java:36)
	at feign.AsyncResponseHandler.decode(AsyncResponseHandler.java:115)
	... 33 more

处理方法:手动注入方式,可在启动类或配置中

@Bean
    @ConditionalOnMissingBean
    public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters) {
        return new HttpMessageConverters(converters.orderedStream().collect(Collectors.toList()));
    }

2.调用超时问题处理

参考对应版本官方文档,如
https://docs.spring.io/spring-cloud-openfeign/docs/2.2.9.RELEASE/reference/html/#timeout-handling

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_ide_25

Sentinel的简单使用

1.下载地址 https://github.com/alibaba/Sentinel ,这里我使用用IDEA Git拉取的

2.启动,通过IDEA 将maven 编译打包,到 Sentinel\sentinel-dashboard\target 下打开cmd

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_26


spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_27

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring_28

3.登录 地址 默认http://localhost:8080/ 账号密码均为 sentinel

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_ide_29

4.父工程添加依赖

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

5.消费者配置

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_30


限流自处理

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_ide_31

服务降级自处理

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_ide_32

需要限流、降级的服务接口

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring cloud alibaba_33


项目启动后在Sentinel中配置限流、熔断等规则


spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_ide_34


spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring cloud alibaba_35

频繁刷新的效果

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring_36

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_spring_37


感谢参考文章:

Spring Cloud GateWay

1.父工程依赖jar,注意GateWay中含有start-web 会与外层引入的冲突

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_ide_38

2. 新建网关项目Module(略)

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_java_39

3.配置

server:
  port: 8888 #项目端口

spring:
  application:
    name: cloud-gateway #项目名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  #注册中心Nacos路径端口
      config:
        server-addr: localhost:8848
        file-extension: yaml #指定yaml格式的配置,此处注意只有yaml和properties两种格式,需要注意
    gateway:
      routes: # 路由数组  指当请求满足什么样的条件的时候,转发到哪个微服务上
        - id: nacosxfz_route #当前路由标识,要求唯一 (默认值uuid,一般不用,需要自定义)
          uri: lb://alibaba-consumer1 #请求最终要被转发的地址
          order: 1 #路由优先级,数字越小,优先级越高
          predicates: #断言 判断条件,返回值是boolean 转发请求要返回的条件 (可以写多个)、
            - Path=/consumer/** #当请求路径满足path指定的规则时,此路由信息才会正常转发
          filters: #过滤器(在请求传递过程中,对请求做一些手脚)
            - StripPrefix=1 # 在请求转发之前去掉一层路径
management:
  endpoints:
    web:
      exposure:
        include: "*"  #健康状态监测

4.展示:即通过网关规则直接访问到其他微服务

spring cloud alibaba从入门到进阶 spring cloud alibaba 教程_ide_40