美文网首页
Spring Cloud Alibaba

Spring Cloud Alibaba

作者: Ktry | 来源:发表于2021-07-01 10:17 被阅读0次
    • ktry-parent

      · pom.xml

      <!--  springboot 整合web组件-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
          <version>0.2.2.RELEASE</version>
      </dependency>
      
    • ktry-book

      ·service.BookService.java

      @RestController
      public class BookService {
          @Value("${server.port}")
          private String serverPort;
          /**
           * 会员服务提供的接口被订单服务调用
           */
          @GetMapping("/getBook")
          public String getBook(Integer userId) {
              return "Book,端口号为:" + serverPort;
          }
      }
      

      ·application.yml

      spring:
        application:
          ###服务的名称
          name: ktry-book
        cloud:
          nacos:
            discovery:
              ###nacos注册地址
              server-addr: 127.0.0.1:8848
      server:
        port: 8070
      
    • ktry-oeder

      ·AppOrder.java

      @SpringBootApplication
      public class AppOrder {
          public static void main(String[] args) {
              SpringApplication.run(AppOrder.class);
          }
          /**
           * 加上LoadBalanced 注解就可以实现我们的本地负载均衡
           */
          @Bean
          @LoadBalanced
          public RestTemplate restTemplate() {
              return new RestTemplate();
          }
      }
      
      

      ·application.yml

      spring:
        application:
          ###服务的名称
          name: ktry-oeder
        cloud:
          nacos:
            discovery:
              ###nacos注册地址
              server-addr: 127.0.0.1:8848
      server:
        port: 8080
      

      ·service.BookService.java

      @RestController
      public class BookService {
          @Autowired
          private RestTemplate restTemplate;   
          /**
           * 基于Ribbon实现本地负载均衡
           */
          @RequestMapping("/orderToRibbonBook")
          public Object orderToRibbonMember() {
              String result = restTemplate.getForObject("http://meitemayikt-book/getBook", String.class);
              return "订单调用会员返回结果:" + result;
          }
          
      }
      
    • ktry-gateway

      ·application.yml

      server:
        port: 80
      ####服务网关名称
      spring:
        application:
          name: ktry-gateway
        cloud:
          gateway:
            ###路由策略
            routes:
              ###根据我们的服务名称查找地址实现调用
              - id: book
                ####转发http://www.mayikt.com/
                uri: lb://meitemayikt-book/
                filters:
                  - StripPrefix=1
                ###匹配规则
                predicates:
                  - Path=/book/**
              - id: mayikt
                uri: http://www.mayikt.com/
                predicates:
                  - Path=/mykt/**
      
            discovery:
              locator:
                ###允许通过注册中心获取地址调用
                enabled: true
          nacos:
            discovery:
              server-addr: 127.0.0.1:8848
      
      

      ·filter.TokenGlobalFilter.java

      //拦截器
      @Component
      public class TokenGlobalFilter implements GlobalFilter, Ordered {
          @Override
          public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
              String token = exchange.getRequest().getQueryParams().getFirst("token");
              if (StringUtils.isEmpty(token)) {
                  ServerHttpResponse response = exchange.getResponse();
                  response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
                  String msg = "token not is null ";
                  DataBuffer buffer = response.bufferFactory().wrap(msg.getBytes());
                  return response.writeWith(Mono.just(buffer));
              }
              // 直接转发到我们真实服务
              return chain.filter(exchange);
          }
          @Override
          public int getOrder() {
              return 0;
          }
      }
      

      ·动态添加路由servive.GatewayService.java

      @Service
      public class GatewayService implements ApplicationEventPublisherAware {
          private ApplicationEventPublisher publisher;
          @Autowired
          private RouteDefinitionWriter routeDefinitionWriter;
      
      
          @Override
          public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
              this.publisher = applicationEventPublisher;
          }
      
      
      
      
          public String loadRoute(GateWayEntity gateWayEntity) {
              RouteDefinition definition = new RouteDefinition();
              Map<String, String> predicateParams = new HashMap<>(8);
              PredicateDefinition predicate = new PredicateDefinition();
              FilterDefinition filterDefinition = new FilterDefinition();
              Map<String, String> filterParams = new HashMap<>(8);
              URI uri = null;
              if ("0".equals(gateWayEntity.getRouteType())) {
                  // 如果配置路由type为0的话 则从注册中心获取服务地址
                  uri = UriComponentsBuilder.fromUriString("lb://" + gateWayEntity.getRouteUrl() + "/").build().toUri();
              } else {
                  uri = UriComponentsBuilder.fromHttpUrl(gateWayEntity.getRouteUrl()).build().toUri();
              }
      
              // 定义的路由唯一的id
              definition.setId(gateWayEntity.getRouteId());
              predicate.setName("Path");
              //路由转发地址
              predicateParams.put("pattern", gateWayEntity.getRoutePattern());
              predicate.setArgs(predicateParams);
      
              // 名称是固定的, 路径去前缀
              filterDefinition.setName("StripPrefix");
              filterParams.put("_genkey_0", "1");
              filterDefinition.setArgs(filterParams);
              definition.setPredicates(Arrays.asList(predicate));
              definition.setFilters(Arrays.asList(filterDefinition));
              definition.setUri(uri);
              routeDefinitionWriter.save(Mono.just(definition)).subscribe();
              this.publisher.publishEvent(new RefreshRoutesEvent(this));
      
      
              return "success";
          }
      
      }
      
      

      ·pojo.GateWayEntity.java

      @Data
      @AllArgsConstructor
      public class GateWayEntity {
          private Long id;
          private String routeId;
          private String routeName;
          private String routePattern;
          private String routeType;
          private String routeUrl;
      }
      
      

      ·测试

      @RestController
      public class GatewayController {
          @Autowired
          private GatewayService gatewayService;
      
          /**
           * 同步网关配置
           *
           * @return
           */
          @RequestMapping("/synGatewayConfig")
          public String synGatewayConfig() {
              GateWayEntity gateWayEntity = new GateWayEntity(null,"book","meitemayiktbook","/book/**","0","meitemayikt-book");
              return gatewayService.loadRoute(gateWayEntity);
          }
      }
      
      

      ·解决全局跨域filter.CrossOriginFilter.java

      @Component
      public class CrossOriginFilter implements GlobalFilter {
          @Override
          public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
              ServerHttpRequest request = exchange.getRequest();
              ServerHttpResponse response = exchange.getResponse();
              HttpHeaders headers = response.getHeaders();
              headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
              headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "POST, GET, PUT, OPTIONS, DELETE, PATCH");
              headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
              headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
              headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
              return chain.filter(exchange);
          }
      }
      

          <!-- 分布式配置中心 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
                <version>0.2.2.RELEASE</version>
            </dependency>
    

    application.yml -> bootstrap

          config:
            server-addr: 
            file-extension: yaml
    

    @RefreshScope 刷新

    seata表

    CREATE TABLE `branch_table` (
      `branch_id` bigint(20) NOT NULL,
      `xid` varchar(128) NOT NULL,
      `transaction_id` bigint(20) DEFAULT NULL,
      `resource_group_id` varchar(32) DEFAULT NULL,
      `resource_id` varchar(256) DEFAULT NULL,
      `lock_key` varchar(128) DEFAULT NULL,
      `branch_type` varchar(8) DEFAULT NULL,
      `status` tinyint(4) DEFAULT NULL,
      `client_id` varchar(64) DEFAULT NULL,
      `application_data` varchar(2000) DEFAULT NULL,
      `gmt_create` datetime DEFAULT NULL,
      `gmt_modified` datetime DEFAULT NULL,
      PRIMARY KEY (`branch_id`),
      KEY `idx_xid` (`xid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    CREATE TABLE `global_table` (
      `xid` varchar(128) NOT NULL,
      `transaction_id` bigint(20) DEFAULT NULL,
      `status` tinyint(4) NOT NULL,
      `application_id` varchar(32) DEFAULT NULL,
      `transaction_service_group` varchar(32) DEFAULT NULL,
      `transaction_name` varchar(128) DEFAULT NULL,
      `timeout` int(11) DEFAULT NULL,
      `begin_time` bigint(20) DEFAULT NULL,
      `application_data` varchar(2000) DEFAULT NULL,
      `gmt_create` datetime DEFAULT NULL,
      `gmt_modified` datetime DEFAULT NULL,
      PRIMARY KEY (`xid`),
      KEY `idx_gmt_modified_status` (`gmt_modified`,`status`),
      KEY `idx_transaction_id` (`transaction_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    
    CREATE TABLE `lock_table` (
      `row_key` varchar(250) NOT NULL,
      `xid` varchar(96) DEFAULT NULL,
      `transaction_id` mediumtext,
      `branch_id` mediumtext,
      `resource_id` varchar(256) DEFAULT NULL,
      `table_name` varchar(100) DEFAULT NULL,
      `pk` varchar(36) DEFAULT NULL,
      `gmt_create` datetime DEFAULT NULL,
      `gmt_modified` datetime DEFAULT NULL,
      PRIMARY KEY (`row_key`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    

    相关文章

      网友评论

          本文标题:Spring Cloud Alibaba

          本文链接:https://www.haomeiwen.com/subject/rthjultx.html