springcloud入门案例(使用nacos/eureka、feign、ribbon、gateway组件)

  1. 安装注册中心nacos。使用startup.cmd -m standalone可以不以集群方式启动,此时不需要配置conf文件。nacos默认端口8848,默认服务管理平台登录账号和密码都是nacos(服务起起来后进入localhost:8848)

  2. 新建maven的父工程project,在父工程的pom文件中导入springboot的parent依赖与springcloud的依赖

        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.9.RELEASE</version>
            <relativePath/>
        </parent>
    
    	<dependencyManagement>
            <dependencies>
                <!-- springCloud -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <!--nacos的管理依赖-->
                <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>
                <!-- mysql驱动 -->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>${mysql.version}</version>
                </dependency>
                <!--mybatis-->
                <dependency>
                    <groupId>org.mybatis.spring.boot</groupId>
                    <artifactId>mybatis-spring-boot-starter</artifactId>
                    <version>${mybatis.version}</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
        <dependencies>
            <!--lomboc-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
        </dependencies>
    
  3. 编写feign-api模块。feign的接口规范。

    1. 新建模块feign-api,编写pom文件,继承父工程依赖并导入feign的依赖

          <parent>
              <artifactId>mycloud</artifactId>
              <groupId>com.lin</groupId>
              <version>1.0</version>
          </parent>    
      	<dependencies>
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-openfeign</artifactId>
              </dependency>
          </dependencies>
      
    2. 编写远程调用接口(类似于springmvc里的Controller)和一些实体类pojo

      //Feign的远程调用接口
      @FeignClient(value = "userservice")
      public interface UserClient {
      
          @GetMapping("/user/{id}")
          User findById(@PathVariable("id") Long id);
      }
      
      //实体类
      @Data
      public class User {
          private Long id;
          private String username;
          private String address;
      }
      
    3. 用maven打包该feign-api模块,在后面的模块中需要导入该依赖

  4. 编写生产者模块

    1. 新建user-service模块,编写pom文件,继承父工程依赖并导入nacos客户端依赖、nacos配置管理依赖

          	<parent>
              	<artifactId>mycloud</artifactId>
              	<groupId>com.lin</groupId>
              	<version>1.0</version>
          	</parent>         
      		<!-- nacos客户端依赖包 -->
              <dependency>
                  <groupId>com.alibaba.cloud</groupId>
                  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
              </dependency>
              <!--nacos的配置管理依赖-->
              <dependency>
                  <groupId>com.alibaba.cloud</groupId>
                  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
              </dependency>
      
    2. 编写springboot的配置文件bootstrap.yml(此文件优先于application.yml文件加载),在里面配置该服务的名字以及nacos注册中心与配置中心信息

      spring:
        application:
          name: userservice
        cloud:
          nacos:
            server-addr: 127.0.0.1:8848 # nacos地址
            #配置中心
            config:
              file-extension: yaml # 文件后缀名
      
    3. 编写springboot的配置文件application.yml

      server:
        #同一台机器上用不同服务端口来区分不同服务,防止端口冲突
        port: 8081
      spring:
        #数据源基本配置
        datasource:
          url: jdbc:mysql://127.0.0.1:3306/cloud_user?useSSL=false&characterEncoding=UTF-8&
            zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver
      
    4. 编写代码(与之前springboot开放没有什么区别)

  5. 编写消费者模块

    1. 新建order-service模块,编写pom文件,继承父工程依赖并导入nacos依赖、feign客户端依赖、HttpClient依赖(这里不使用feign里的默认http客户端)、和之前编写的feign的接口依赖,这里就不需要导入ribbon了,因为feign底层本来就是使用ribbon做负载均衡

              <!-- nacos客户端依赖包 -->
              <dependency>
                  <groupId>com.alibaba.cloud</groupId>
                  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
              </dependency>
              <!--nacos的配置管理依赖-->
              <dependency>
                  <groupId>com.alibaba.cloud</groupId>
                  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
              </dependency>
              <!--feign客户端依赖-->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-openfeign</artifactId>
              </dependency>
              <!--引入HttpClient依赖-->
              <dependency>
                  <groupId>io.github.openfeign</groupId>
                  <artifactId>feign-httpclient</artifactId>
              </dependency>
              <!--引入feign的统一api-->
              <dependency>
                  <groupId>com.lin.mycloud</groupId>
                  <artifactId>feign-api</artifactId>
                  <version>1.0</version>
              </dependency>
      
    2. 编写springboot的配置文件bootstrap.yml(此文件优先于application.yml文件加载),在里面配置该服务的名字以及nacos注册中心与配置中心信息

      spring:
        application:
          name: orderservice
        cloud:
          nacos:
            server-addr: 127.0.0.1:8848 # nacos地址
            #配置中心
            config:
              file-extension: yaml # 文件后缀名
      
    3. 编写springboot的配置文件application.yml

      server:
        #同一台机器上用不同服务端口来区分不同服务,防止端口冲突
        port: 8082
      spring:
        #数据源基本配置
        datasource:
          url: jdbc:mysql://127.0.0.1:3306/cloud_order?useSSL=false&characterEncoding=UTF-8&
            zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver
      ribbon: #开启ribbon的饥饿加载
        eager-load:
          enabled: true # 开启饥饿加载
          clients: # 指定饥饿加载的服务名称
            - userservice
      feign: #开启HttpClient
        httpclient:
          enabled: true # 支持HttpClient的开关
          max-connections: 200 # 最大连接数
          max-connections-per-route: 50 # 单个路径的最大连接数
      userservice: #设置userservice的远程调用配置
        ribbon:
          NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  # 负载均衡规则
      
    4. 编写代码(大部分与之前springboot开放没有什么区别),在需要使用feign远程调用时在该类用spring注入UserClient(这个在之前的feign-api里编写了),并调用该userClient

          @Autowired
          private UserClient userClient;
      
      	//以下在方法体中,演示如何进行远程调用
      	User user = userClient.findById(order.getUserId());
      
    5. 在主启动类上加上@EnableFeignClients注解开启Feign客户端

      @SpringBootApplication
      @EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)
      public class OrderApplication {
      
          public static void main(String[] args) {
              SpringApplication.run(OrderApplication.class, args);
          }
      }
      
  6. 编写网关模块

    1. 新建gateway模块,编写pom文件,继承父工程依赖并导入nacos依赖与gateway网关依赖

          	<parent>
              	<artifactId>mycloud</artifactId>
              	<groupId>com.lin</groupId>
              	<version>1.0</version>
          	</parent>   
              <!-- nacos客户端依赖包 -->
              <dependency>
                  <groupId>com.alibaba.cloud</groupId>
                  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
              </dependency>
              <!--网关gateway依赖-->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-gateway</artifactId>
              </dependency>
      
    2. 编写springboot的配置文件application.yml

      server:
        port: 8080
      spring:
        application:
          name: gateway
        cloud:
          nacos:
            server-addr: 127.0.0.1:8848 # nacos地址
          gateway:
            routes:
              - id: user-service # 路由标示,必须唯一
                uri: lb://userservice # 路由的目标地址
                predicates: # 路由断言,判断请求是否符合规则
                  - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
              - id: order-service
                uri: lb://orderservice
                predicates:
                  - Path=/order/**
            #default-filters: #使用默认过滤器
              #- AddRequestHeader=xxx
      
    3. 配置全局过滤器,编写类实现GlobalFilter接口,并在该类上加入@Component使其成为spring容器管理的bean,该过滤器类有两种设置过滤器链中权重的方式,其一是在该类上加入@Order(权重值)注解;或是使该类实现Ordered接口,并实现其中的getOrder()方法配置权重

      @Component
      public class AuthorizeFilter implements GlobalFilter, Ordered {
          @Override
          public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
              // 1.获取请求参数
              ServerHttpRequest request = exchange.getRequest();
              MultiValueMap<String, String> params = request.getQueryParams();
              // 2.获取参数中的 user 参数
              String username = params.getFirst("user");
              // 3.判断参数值是否等于 admin
              if ("admin".equals(username)) {
                  // 4.是,放行
                  return chain.filter(exchange);
              }
              // 5.否,拦截
              // 5.1.设置状态码
              exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
              // 5.2.拦截请求
              return exchange.getResponse().setComplete();
          }
      
          @Override
          public int getOrder() {
              return -1;
          }
      }
      
  7. 若是不想使用nacos注册中心而是使用eureka,则需要新建一个eureka模块,并对上面进行一些修改

    1. 新建eureka-server模块,编写pom文件,继承父工程依赖并导入eureka依赖

      	<parent>
          	<artifactId>mycloud</artifactId>
          	<groupId>com.lin</groupId>
          	<version>1.0</version>
      	</parent>           
      	<!--eureka服务端-->
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
          </dependency>
      
    2. 编写springboot的配置文件application.yml

      server:
        port: 8848 # 服务端口
      spring:
        application:
          name: eurekaserver # eureka的服务名称
      eureka:
        client:
          service-url:  # eureka的地址信息
            defaultZone: http://127.0.0.1:8848/eureka
      
    3. 将上面代码中所以的nacos依赖与配置全部换成eureka的依赖与配置(父项目中的nacos依赖也需要去掉)

              <!--eureka客户端依赖-->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
              </dependency>
      
      eureka:
        client:
          service-url:  # eureka的地址信息
            defaultZone: http://127.0.0.1:8848/eureka
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值