前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud Alibaba 项目搭建

Spring Cloud Alibaba 项目搭建

原创
作者头像
ruochen
修改2021-11-25 12:51:46
4880
修改2021-11-25 12:51:46
举报

四种授权模式

授权码模式(authorization code):正宗的OAuth2的授权模式,客户端先将用户导向认证服务器,登录后获取授权码,然后进行授权,最后根据授权码获取访问令牌; 简化模式(implicit):和授权码模式相比,取消了获取授权码的过程,直接获取访问令牌; 密码模式(resource owner password credentials):客户端直接向用户获取用户名和密码,之后向认证服务器获取访问令牌; 客户端模式(client credentials):客户端直接通过客户端认证(比如client_id和client_secret)从认证服务器获取访问令牌。

这里我们用的是密码模式

一、项目 - New - Module
二、选择Maven - jdk- Next
三、修改Name为 oauth - 查看GroupId是否正确 - Finish
四、修改pom.xml文件
代码语言:txt
复制
<?xml version="1.0" encoding="UTF-8"?>
代码语言:txt
复制
<project xmlns="http://maven.apache.org/POM/4.0.0"
代码语言:txt
复制
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
代码语言:txt
复制
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
代码语言:txt
复制
    <parent>
代码语言:txt
复制
        <artifactId>bi-cloud</artifactId>
代码语言:txt
复制
        <groupId>com.bi.cloud</groupId>
代码语言:txt
复制
        <version>1.0-SNAPSHOT</version>
代码语言:txt
复制
    </parent>
代码语言:txt
复制
    <modelVersion>4.0.0</modelVersion>
代码语言:txt
复制
    <artifactId>oauth</artifactId>
代码语言:txt
复制
    <dependencies>
代码语言:txt
复制
        <!--集成公共模块-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.bi.cloud</groupId>
代码语言:txt
复制
            <artifactId>common</artifactId>
代码语言:txt
复制
            <version>1.0-SNAPSHOT</version>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--nacos service discovery client依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--nacos config client 依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!-- Java Servlet -->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>javax.servlet</groupId>
代码语言:txt
复制
            <artifactId>javax.servlet-api</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-starter-web</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--导入spring cloud oauth2依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-starter-web</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-oauth2</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-starter-data-redis</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-starter-actuator</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
    </dependencies>
代码语言:txt
复制
</project>
五、java - New - Java Class 新增启动类 com.bi.cloud.OauthApplication
代码语言:txt
复制
package com.bi.cloud;
代码语言:txt
复制
import org.mybatis.spring.annotation.MapperScan;
代码语言:txt
复制
import org.springframework.boot.SpringApplication;
代码语言:txt
复制
import org.springframework.boot.autoconfigure.SpringBootApplication;
代码语言:txt
复制
import org.springframework.boot.autoconfigure.domain.EntityScan;
代码语言:txt
复制
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
代码语言:txt
复制
@SpringBootApplication
代码语言:txt
复制
@EnableDiscoveryClient
代码语言:txt
复制
@EntityScan("com.bi.cloud.pojo")
代码语言:txt
复制
@MapperScan("com.bi.cloud.dao")
代码语言:txt
复制
public class OauthApplication {
代码语言:txt
复制
    public static void main(String[] args) {
代码语言:txt
复制
        SpringApplication.run(OauthApplication.class, args);
代码语言:txt
复制
    }
代码语言:txt
复制
}
六、在resources下新增bootstrap.yml 配置文件
bootstrap.yml 配置文件展示
代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles:
代码语言:txt
复制
    active: test
代码语言:txt
复制
---
代码语言:txt
复制
server:
代码语言:txt
复制
  port: 8002
代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles: test
代码语言:txt
复制
  application:
代码语言:txt
复制
    name: bi-cloud-oauth
代码语言:txt
复制
  cloud:
代码语言:txt
复制
    nacos:
代码语言:txt
复制
      discovery:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: a60273f4-07fb-4568-82eb-d078a3b02107 #Nacos 命名空间ID
代码语言:txt
复制
      config:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: a60273f4-07fb-4568-82eb-d078a3b02107 #Nacos 命名空间ID
代码语言:txt
复制
        group: DEFAULT_GROUP  # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
代码语言:txt
复制
        file-extension: yml   #默认properties
代码语言:txt
复制
---
代码语言:txt
复制
server:
代码语言:txt
复制
  port: 8002
代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles: pre
代码语言:txt
复制
  application:
代码语言:txt
复制
    name: bi-cloud-oauth
代码语言:txt
复制
  cloud:
代码语言:txt
复制
    nacos:
代码语言:txt
复制
      discovery:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: c60d2198-0b2f-46c1-82cb-4c2f20fb8123 #Nacos 命名空间ID
代码语言:txt
复制
      config:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: c60d2198-0b2f-46c1-82cb-4c2f20fb8123 #Nacos 命名空间ID
代码语言:txt
复制
        group: DEFAULT_GROUP  # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
代码语言:txt
复制
        file-extension: yml   #默认properties
代码语言:txt
复制
---
代码语言:txt
复制
server:
代码语言:txt
复制
  port: 8002
代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles: prd
代码语言:txt
复制
  application:
代码语言:txt
复制
    name: bi-cloud-oauth
代码语言:txt
复制
  cloud:
代码语言:txt
复制
    nacos:
代码语言:txt
复制
      discovery:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: 0be74aa4-00e5-4c48-ae8c-34965c327212 #Nacos 命名空间ID
代码语言:txt
复制
      config:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: 0be74aa4-00e5-4c48-ae8c-34965c327212 #Nacos 命名空间ID
代码语言:txt
复制
        group: DEFAULT_GROUP  # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
代码语言:txt
复制
        file-extension: yml   #默认properties
七、Nacos配置(下图为test环境 配置展示,pre、prd配置方式一致,唯一要注意的是每个环境的命名后缀都是不同的)
代码语言:txt
复制
spring:
代码语言:txt
复制
  datasource:
代码语言:txt
复制
    driver-class-name: com.mysql.jdbc.Driver
代码语言:txt
复制
    url: jdbc:mysql://192.168.*.***:3306/****?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
代码语言:txt
复制
    username: *****
代码语言:txt
复制
    password: admin
代码语言:txt
复制
    druid:
代码语言:txt
复制
      initialSize: 10
代码语言:txt
复制
      minIdle: 10
代码语言:txt
复制
      maxActive: 30
代码语言:txt
复制
      maxWait: 50000
代码语言:txt
复制
  redis:
代码语言:txt
复制
    database: 1
代码语言:txt
复制
    host: 192.168.*.***
代码语言:txt
复制
    port: 6379
代码语言:txt
复制
    password: ****
代码语言:txt
复制
    timeout: 5000
代码语言:txt
复制
mybatis:
代码语言:txt
复制
  mapper-locations: classpath:mapper/*.xml
八、用 Redis 的方式来实现 token 的存储

**分别添加 RedisTokenStoreConfig.class 、OAuthConfig.class

、WebSecurityConfig.class**

代码语言:txt
复制
package com.bi.cloud.config;
代码语言:txt
复制
import org.springframework.beans.factory.annotation.Autowired;
代码语言:txt
复制
import org.springframework.context.annotation.Configuration;
代码语言:txt
复制
import org.springframework.security.authentication.AuthenticationManager;
代码语言:txt
复制
import org.springframework.security.core.userdetails.UserDetailsService;
代码语言:txt
复制
import org.springframework.security.crypto.password.PasswordEncoder;
代码语言:txt
复制
import org.springframework.security.oauth2.config.annotation.builders.JdbcClientDetailsServiceBuilder;
代码语言:txt
复制
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
代码语言:txt
复制
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
代码语言:txt
复制
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
代码语言:txt
复制
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
代码语言:txt
复制
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
代码语言:txt
复制
import org.springframework.security.oauth2.provider.token.TokenStore;
代码语言:txt
复制
import javax.sql.DataSource;
代码语言:txt
复制
@Configuration
代码语言:txt
复制
@EnableAuthorizationServer
代码语言:txt
复制
public class OAuthConfig extends AuthorizationServerConfigurerAdapter {
代码语言:txt
复制
    @Autowired
代码语言:txt
复制
    public PasswordEncoder passwordEncoder;
代码语言:txt
复制
    @Autowired
代码语言:txt
复制
    public UserDetailsService kiteUserDetailsService;
代码语言:txt
复制
    @Autowired
代码语言:txt
复制
    private AuthenticationManager authenticationManager;
代码语言:txt
复制
    @Autowired
代码语言:txt
复制
    private TokenStore redisTokenStore;
代码语言:txt
复制
    @Autowired
代码语言:txt
复制
    private DataSource dataSource;
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void configure(final AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
代码语言:txt
复制
        /**
代码语言:txt
复制
         * redis token 方式
         */
        endpoints.authenticationManager(authenticationManager)
                .userDetailsService(kiteUserDetailsService)
                .tokenStore(redisTokenStore);
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
代码语言:txt
复制
        JdbcClientDetailsServiceBuilder jcsb = clients.jdbc(dataSource);
代码语言:txt
复制
        jcsb.passwordEncoder(passwordEncoder);
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
代码语言:txt
复制
        security.allowFormAuthenticationForClients();
代码语言:txt
复制
        security.checkTokenAccess("isAuthenticated()");
代码语言:txt
复制
        security.tokenKeyAccess("isAuthenticated()");
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
package com.bi.cloud.config;
代码语言:txt
复制
import org.springframework.beans.factory.annotation.Autowired;
代码语言:txt
复制
import org.springframework.context.annotation.Bean;
代码语言:txt
复制
import org.springframework.context.annotation.Configuration;
代码语言:txt
复制
import org.springframework.data.redis.connection.RedisConnectionFactory;
代码语言:txt
复制
import org.springframework.security.oauth2.provider.token.TokenStore;
代码语言:txt
复制
import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
代码语言:txt
复制
@Configuration
代码语言:txt
复制
public class RedisTokenStoreConfig {
代码语言:txt
复制
    @Autowired
代码语言:txt
复制
    private RedisConnectionFactory redisConnectionFactory;
代码语言:txt
复制
    @Bean
代码语言:txt
复制
    public TokenStore redisTokenStore (){
代码语言:txt
复制
        return new RedisTokenStore(redisConnectionFactory);
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
package com.bi.cloud.config;
代码语言:txt
复制
import org.springframework.context.annotation.Bean;
代码语言:txt
复制
import org.springframework.security.authentication.AuthenticationManager;
代码语言:txt
复制
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
代码语言:txt
复制
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
代码语言:txt
复制
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
代码语言:txt
复制
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
代码语言:txt
复制
import org.springframework.security.crypto.password.PasswordEncoder;
代码语言:txt
复制
@EnableWebSecurity
代码语言:txt
复制
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
代码语言:txt
复制
    @Bean
代码语言:txt
复制
    public PasswordEncoder passwordEncoder() {
代码语言:txt
复制
        return new BCryptPasswordEncoder();
代码语言:txt
复制
    }
代码语言:txt
复制
    @Bean
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public AuthenticationManager authenticationManagerBean() throws Exception {
代码语言:txt
复制
        return super.authenticationManagerBean();
代码语言:txt
复制
    }
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 允许匿名访问所有接口 主要是 oauth 接口
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/**").permitAll();
    }
}
九、添加AuthUserService.class 读取数据库用户信息
代码语言:txt
复制
//oauth_client表
代码语言:txt
复制
create table oauth_client_details (
代码语言:txt
复制
    client_id VARCHAR(256) PRIMARY KEY,
代码语言:txt
复制
    resource_ids VARCHAR(256),
代码语言:txt
复制
    client_secret VARCHAR(256),
代码语言:txt
复制
    scope VARCHAR(256),
代码语言:txt
复制
    authorized_grant_types VARCHAR(256),
代码语言:txt
复制
    web_server_redirect_uri VARCHAR(256),
代码语言:txt
复制
    authorities VARCHAR(256),
代码语言:txt
复制
    access_token_validity INTEGER,
代码语言:txt
复制
    refresh_token_validity INTEGER,
代码语言:txt
复制
    additional_information VARCHAR(4096),
代码语言:txt
复制
    autoapprove VARCHAR(256)
代码语言:txt
复制
);
代码语言:txt
复制
INSERT INTO oauth_client_details
代码语言:txt
复制
    (client_id, client_secret, scope, authorized_grant_types,
代码语言:txt
复制
    web_server_redirect_uri, authorities, access_token_validity,
代码语言:txt
复制
    refresh_token_validity, additional_information, autoapprove)
代码语言:txt
复制
VALUES
代码语言:txt
复制
    ('user-client', '$2a$10$o2l5kA7z.Caekp72h5kU7uqdTDrlamLq.57M1F6ulJln9tRtOJufq', 'all',
代码语言:txt
复制
    'authorization_code,refresh_token,password', null, null, 3600, 36000, null, true);
代码语言:txt
复制
INSERT INTO oauth_client_details
代码语言:txt
复制
    (client_id, client_secret, scope, authorized_grant_types,
代码语言:txt
复制
    web_server_redirect_uri, authorities, access_token_validity,
代码语言:txt
复制
    refresh_token_validity, additional_information, autoapprove)
代码语言:txt
复制
VALUES
代码语言:txt
复制
    ('order-client', '$2a$10$GoIOhjqFKVyrabUNcie8d.ADX.qZSxpYbO6YK4L2gsNzlCIxEUDlW', 'all',
代码语言:txt
复制
    'authorization_code,refresh_token,password', null, null, 3600, 36000, null, true);
代码语言:txt
复制
//-------------------------------------------------------------------------------------------------------
代码语言:txt
复制
//用户表
代码语言:txt
复制
CREATE TABLE `bi_user` (
代码语言:txt
复制
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
代码语言:txt
复制
  `username` varchar(255) DEFAULT NULL,
代码语言:txt
复制
  `password` varchar(255) DEFAULT NULL,
代码语言:txt
复制
  PRIMARY KEY (`id`)
代码语言:txt
复制
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
代码语言:txt
复制
INSERT INTO `bi_user`(`id`, `username`, `password`) VALUES (1, 'admin', '123456');//正常数据库密码加密,这里只为演示
代码语言:txt
复制
package com.bi.cloud.service;
代码语言:txt
复制
import com.bi.cloud.dao.UserDao;
代码语言:txt
复制
import com.bi.cloud.pojo.Users;
代码语言:txt
复制
import lombok.extern.slf4j.Slf4j;
代码语言:txt
复制
import org.apache.commons.lang3.StringUtils;
代码语言:txt
复制
import org.springframework.beans.factory.annotation.Autowired;
代码语言:txt
复制
import org.springframework.security.core.userdetails.User;
代码语言:txt
复制
import org.springframework.security.core.userdetails.UserDetails;
代码语言:txt
复制
import org.springframework.security.core.userdetails.UserDetailsService;
代码语言:txt
复制
import org.springframework.security.core.userdetails.UsernameNotFoundException;
代码语言:txt
复制
import org.springframework.security.crypto.password.PasswordEncoder;
代码语言:txt
复制
import org.springframework.stereotype.Component;
代码语言:txt
复制
import java.util.ArrayList;
代码语言:txt
复制
@Slf4j
代码语言:txt
复制
@Component
代码语言:txt
复制
public class AuthUserService implements UserDetailsService {
代码语言:txt
复制
    @Autowired
代码语言:txt
复制
    private UserDao userDao;
代码语言:txt
复制
    @Autowired
代码语言:txt
复制
    private PasswordEncoder passwordEncoder;
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
代码语言:txt
复制
        log.info("username:" + username);
代码语言:txt
复制
        // 查询数据库操作
代码语言:txt
复制
        Users users = userDao.getUsers(username);
代码语言:txt
复制
        if (StringUtils.isBlank(users.getPassword())) {
代码语言:txt
复制
            throw new UsernameNotFoundException("the user is not found");
代码语言:txt
复制
        }
代码语言:txt
复制
        String password = passwordEncoder.encode(users.getPassword());
代码语言:txt
复制
        return new User(username, password, new ArrayList<>());
代码语言:txt
复制
    }
代码语言:txt
复制
}
十、SpringCloud Gateway jar包 和 oauth2 包有冲突 所以我们将gateway只作为网关,新增子模块api 用于调用

engine 子模块

gateway内容迁移至api

bootstrap.yml配置

代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles:
代码语言:txt
复制
    active: test
代码语言:txt
复制
---
代码语言:txt
复制
server:
代码语言:txt
复制
  port: 8008
代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles: test
代码语言:txt
复制
  cloud:
代码语言:txt
复制
    nacos:
代码语言:txt
复制
      discovery:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848
代码语言:txt
复制
        namespace: a60273f4-07fb-4568-82eb-d078a3b02107
代码语言:txt
复制
      config:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848
代码语言:txt
复制
        namespace: a60273f4-07fb-4568-82eb-d078a3b02107
代码语言:txt
复制
        group: DEFAULT_GROUP  # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
代码语言:txt
复制
        file-extension: yml   #默认properties
代码语言:txt
复制
    sentinel:
代码语言:txt
复制
      transport:
代码语言:txt
复制
        dashboard: 127.0.0.1:8080 #配置Sentinel dashboard地址
代码语言:txt
复制
        port: 8719  #这个端口配置会在应用对应的机器上启动一个Http Server,该Server会与 Sentinel 控制台做交互
代码语言:txt
复制
      datasource:
代码语言:txt
复制
        flow:
代码语言:txt
复制
          nacos:
代码语言:txt
复制
            server-addr: 127.0.0.1:8848 #nacos的访问地址,,根据上面准备工作中启动的实例配置
代码语言:txt
复制
            dataId: cloud-sentinel-flow-service #nacos中存储规则的dataId
代码语言:txt
复制
            groupId: DEFAULT_GROUP #nacos中存储规则的groupId
代码语言:txt
复制
            namespace: a60273f4-07fb-4568-82eb-d078a3b02107 #Nacos 命名空间的ID
代码语言:txt
复制
            data-type: json #配置文件类型
代码语言:txt
复制
            rule-type: flow #类型来自RuleType类 - 流控规则
代码语言:txt
复制
        degrade:
代码语言:txt
复制
          nacos:
代码语言:txt
复制
            server-addr: 127.0.0.1:8848 #nacos的访问地址,,根据上面准备工作中启动的实例配置
代码语言:txt
复制
            dataId: cloud-sentinel-degrade-service #nacos中存储规则的dataId
代码语言:txt
复制
            groupId: DEFAULT_GROUP #nacos中存储规则的groupId
代码语言:txt
复制
            namespace: a60273f4-07fb-4568-82eb-d078a3b02107 #Nacos 命名空间的ID
代码语言:txt
复制
            data-type: json #配置文件类型
代码语言:txt
复制
            rule-type: degrade #类型来自RuleType类 - 熔断规则
代码语言:txt
复制
    gateway:
代码语言:txt
复制
      # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]
代码语言:txt
复制
      routes:
代码语言:txt
复制
        - id: bi-cloud-oauth             # 当前路由的标识, 要求唯一
          uri: lb://bi-cloud-oauth       # lb指的是从 nacos 中按照名称获取微服务,并遵循负载均衡策略
          predicates:                    # 断言(就是路由转发要满足的条件)
            - Path=/oauth/**             # 当请求路径满足Path指定的规则时,才进行路由转发
        # 我们⾃定义的路由 ID,保持唯⼀
        - id: bi-cloud-api
          # ⽬标服务地址(部署多实例)
          uri: lb://bi-cloud-api
          # gateway⽹关从服务注册中⼼获取实例信息然后负载后路由
          # 断⾔:路由条件,Predicate 接受⼀个输⼊参数,返回⼀个布尔值结果。该接⼝包含多种默认⽅法来将 Predicate 组合成其他复杂的逻辑(⽐如:与,或,⾮)。
          predicates:
            - Path=/bi-gateway/api/**
          filters:                       # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改
            - StripPrefix=1              # 转发之前去掉1层路径
  application:
    name: bi-cloud-gateway
---
server:
  port: 8008
spring:
  profiles: pre
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: c60d2198-0b2f-46c1-82cb-4c2f20fb8123
      config:
        server-addr: 127.0.0.1:8848
        namespace: c60d2198-0b2f-46c1-82cb-4c2f20fb8123
        group: DEFAULT_GROUP  # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
        file-extension: yml   #默认properties
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080 #配置Sentinel dashboard地址
        port: 8719  #这个端口配置会在应用对应的机器上启动一个Http Server,该Server会与 Sentinel 控制台做交互
      datasource:
        flow:
          nacos:
            server-addr: 127.0.0.1:8848 #nacos的访问地址,,根据上面准备工作中启动的实例配置
            dataId: cloud-sentinel-flow-service #nacos中存储规则的dataId
            groupId: DEFAULT_GROUP #nacos中存储规则的groupId
            namespace: a60273f4-07fb-4568-82eb-d078a3b02107 #Nacos 命名空间的ID
            data-type: json #配置文件类型
            rule-type: flow #类型来自RuleType类 - 流控规则
        degrade:
          nacos:
            server-addr: 127.0.0.1:8848 #nacos的访问地址,,根据上面准备工作中启动的实例配置
            dataId: cloud-sentinel-degrade-service #nacos中存储规则的dataId
            groupId: DEFAULT_GROUP #nacos中存储规则的groupId
            namespace: a60273f4-07fb-4568-82eb-d078a3b02107 #Nacos 命名空间的ID
            data-type: json #配置文件类型
            rule-type: degrade #类型来自RuleType类 - 熔断规则
    gateway:
      # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]
      routes:
        - id: bi-cloud-oauth             # 当前路由的标识, 要求唯一
          uri: lb://bi-cloud-oauth       # lb指的是从 nacos 中按照名称获取微服务,并遵循负载均衡策略
          predicates:                    # 断言(就是路由转发要满足的条件)
            - Path=/oauth/**             # 当请求路径满足Path指定的规则时,才进行路由转发
        # 我们⾃定义的路由 ID,保持唯⼀
        - id: bi-cloud-api
          # ⽬标服务地址(部署多实例)
          uri: lb://bi-cloud-api
          # gateway⽹关从服务注册中⼼获取实例信息然后负载后路由
          # 断⾔:路由条件,Predicate 接受⼀个输⼊参数,返回⼀个布尔值结果。该接⼝包含多种默认⽅法来将 Predicate 组合成其他复杂的逻辑(⽐如:与,或,⾮)。
          predicates:
            - Path=/bi-gateway/api/**
          filters:                       # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改
            - StripPrefix=1              # 转发之前去掉1层路径
  application:
    name: bi-cloud-gateway
---
server:
  port: 8008
spring:
  profiles: prd
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 0be74aa4-00e5-4c48-ae8c-34965c327212
      config:
        server-addr: 127.0.0.1:8848
        namespace: 0be74aa4-00e5-4c48-ae8c-34965c327212
        group: DEFAULT_GROUP  # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
        file-extension: yml   #默认properties
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080 #配置Sentinel dashboard地址
        port: 8719  #这个端口配置会在应用对应的机器上启动一个Http Server,该Server会与 Sentinel 控制台做交互
      datasource:
        flow:
          nacos:
            server-addr: 127.0.0.1:8848 #nacos的访问地址,,根据上面准备工作中启动的实例配置
            dataId: cloud-sentinel-flow-service #nacos中存储规则的dataId
            groupId: DEFAULT_GROUP #nacos中存储规则的groupId
            namespace: a60273f4-07fb-4568-82eb-d078a3b02107 #Nacos 命名空间的ID
            data-type: json #配置文件类型
            rule-type: flow #类型来自RuleType类 - 流控规则
        degrade:
          nacos:
            server-addr: 127.0.0.1:8848 #nacos的访问地址,,根据上面准备工作中启动的实例配置
            dataId: cloud-sentinel-degrade-service #nacos中存储规则的dataId
            groupId: DEFAULT_GROUP #nacos中存储规则的groupId
            namespace: a60273f4-07fb-4568-82eb-d078a3b02107 #Nacos 命名空间的ID
            data-type: json #配置文件类型
            rule-type: degrade #类型来自RuleType类 - 熔断规则
    gateway:
      # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]
      routes:
        - id: bi-cloud-oauth             # 当前路由的标识, 要求唯一
          uri: lb://bi-cloud-oauth       # lb指的是从 nacos 中按照名称获取微服务,并遵循负载均衡策略
          predicates:                    # 断言(就是路由转发要满足的条件)
            - Path=/oauth/**             # 当请求路径满足Path指定的规则时,才进行路由转发
        # 我们⾃定义的路由 ID,保持唯⼀
        - id: bi-cloud-api
          # ⽬标服务地址(部署多实例)
          uri: lb://bi-cloud-api
          # gateway⽹关从服务注册中⼼获取实例信息然后负载后路由
          # 断⾔:路由条件,Predicate 接受⼀个输⼊参数,返回⼀个布尔值结果。该接⼝包含多种默认⽅法来将 Predicate 组合成其他复杂的逻辑(⽐如:与,或,⾮)。
          predicates:
            - Path=/bi-gateway/api/**
          filters:                       # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改
            - StripPrefix=1              # 转发之前去掉1层路径
  application:
    name: bi-cloud-gateway

pom.xml修改

代码语言:txt
复制
<?xml version="1.0" encoding="UTF-8"?>
代码语言:txt
复制
<project xmlns="http://maven.apache.org/POM/4.0.0"
代码语言:txt
复制
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
代码语言:txt
复制
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
代码语言:txt
复制
    <parent>
代码语言:txt
复制
        <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
        <artifactId>spring-boot-starter-parent</artifactId>
代码语言:txt
复制
        <version>2.1.6.RELEASE</version>
代码语言:txt
复制
    </parent>
代码语言:txt
复制
    <modelVersion>4.0.0</modelVersion>
代码语言:txt
复制
    <artifactId>gateway</artifactId>
代码语言:txt
复制
    <dependencies>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-commons</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--GateWay 网关-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-gateway</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--引入webflux-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-starter-webflux</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--日志依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-starter-logging</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--测试依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-starter-test</artifactId>
代码语言:txt
复制
            <scope>test</scope>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--lombok工具-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.projectlombok</groupId>
代码语言:txt
复制
            <artifactId>lombok</artifactId>
代码语言:txt
复制
            <version>1.18.4</version>
代码语言:txt
复制
            <scope>provided</scope>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!-- Actuator可以帮助你监控和管理Spring Boot应⽤-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-starter-actuator</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--热部署-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-devtools</artifactId>
代码语言:txt
复制
            <optional>true</optional>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--nacos config client 依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--链路追踪-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-sleuth</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-zipkin</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
    </dependencies>
代码语言:txt
复制
    <dependencyManagement>
代码语言:txt
复制
        <!--spring cloud依赖版本管理-->
代码语言:txt
复制
        <dependencies>
代码语言:txt
复制
            <dependency>
代码语言:txt
复制
                <groupId>org.springframework.cloud</groupId>
代码语言:txt
复制
                <artifactId>spring-cloud-dependencies</artifactId>
代码语言:txt
复制
                <version>Greenwich.RELEASE</version>
代码语言:txt
复制
                <type>pom</type>
代码语言:txt
复制
                <scope>import</scope>
代码语言:txt
复制
            </dependency>
代码语言:txt
复制
            <!--SCA -->
代码语言:txt
复制
            <dependency>
代码语言:txt
复制
                <groupId>com.alibaba.cloud</groupId>
代码语言:txt
复制
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
代码语言:txt
复制
                <version>2.1.0.RELEASE</version>
代码语言:txt
复制
                <type>pom</type>
代码语言:txt
复制
                <scope>import</scope>
代码语言:txt
复制
            </dependency>
代码语言:txt
复制
            <!--SCA -->
代码语言:txt
复制
        </dependencies>
代码语言:txt
复制
    </dependencyManagement>
代码语言:txt
复制
    <build>
代码语言:txt
复制
        <plugins>
代码语言:txt
复制
            <!--编译插件-->
代码语言:txt
复制
            <plugin>
代码语言:txt
复制
                <groupId>org.apache.maven.plugins</groupId>
代码语言:txt
复制
                <artifactId>maven-compiler-plugin</artifactId>
代码语言:txt
复制
                <configuration>
代码语言:txt
复制
                    <source>8</source>
代码语言:txt
复制
                    <target>8</target>
代码语言:txt
复制
                    <encoding>utf-8</encoding>
代码语言:txt
复制
                </configuration>
代码语言:txt
复制
            </plugin>
代码语言:txt
复制
            <!--打包插件-->
代码语言:txt
复制
            <plugin>
代码语言:txt
复制
                <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
                <artifactId>spring-boot-maven-plugin</artifactId>
代码语言:txt
复制
            </plugin>
代码语言:txt
复制
        </plugins>
代码语言:txt
复制
    </build>
代码语言:txt
复制
</project>

Nacos配置修改删除即可

GatewayApplication.class 启动类

代码语言:txt
复制
package com.bi.cloud;
代码语言:txt
复制
import org.springframework.boot.SpringApplication;
代码语言:txt
复制
import org.springframework.boot.autoconfigure.SpringBootApplication;
代码语言:txt
复制
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
代码语言:txt
复制
@SpringBootApplication
代码语言:txt
复制
@EnableDiscoveryClient
代码语言:txt
复制
public class GatewayApplication {
代码语言:txt
复制
    public static void main(String[] args) {
代码语言:txt
复制
        SpringApplication.run(GatewayApplication.class, args);
代码语言:txt
复制
    }
代码语言:txt
复制
}
十一、common增加dao、mapper、mapper.xml文件用于数据库操作

pom.xml 展示

代码语言:txt
复制
<?xml version="1.0" encoding="UTF-8"?>
代码语言:txt
复制
<project xmlns="http://maven.apache.org/POM/4.0.0"
代码语言:txt
复制
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
代码语言:txt
复制
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
代码语言:txt
复制
    <parent>
代码语言:txt
复制
        <artifactId>bi-cloud</artifactId>
代码语言:txt
复制
        <groupId>com.bi.cloud</groupId>
代码语言:txt
复制
        <version>1.0-SNAPSHOT</version>
代码语言:txt
复制
    </parent>
代码语言:txt
复制
    <modelVersion>4.0.0</modelVersion>
代码语言:txt
复制
    <artifactId>common</artifactId>
代码语言:txt
复制
    <dependencies>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-starter</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!-- StringUtils -->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.apache.commons</groupId>
代码语言:txt
复制
            <artifactId>commons-lang3</artifactId>
代码语言:txt
复制
            <version>3.11</version>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!-- mysql -->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>mysql</groupId>
代码语言:txt
复制
            <artifactId>mysql-connector-java</artifactId>
代码语言:txt
复制
            <scope>runtime</scope>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.mybatis.spring.boot</groupId>
代码语言:txt
复制
            <artifactId>mybatis-spring-boot-starter</artifactId>
代码语言:txt
复制
            <version>2.0.0</version>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!-- 数据库连接池 -->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba</groupId>
代码语言:txt
复制
            <artifactId>druid-spring-boot-starter</artifactId>
代码语言:txt
复制
            <version>1.1.22</version>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
    </dependencies>
代码语言:txt
复制
    <build>
代码语言:txt
复制
        <plugins>
代码语言:txt
复制
            <plugin>
代码语言:txt
复制
                <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
                <artifactId>spring-boot-maven-plugin</artifactId>
代码语言:txt
复制
                <configuration>
代码语言:txt
复制
                    <skip>true</skip>
代码语言:txt
复制
                </configuration>
代码语言:txt
复制
            </plugin>
代码语言:txt
复制
        </plugins>
代码语言:txt
复制
    </build>
代码语言:txt
复制
</project>

新增或修改 UserDao、Users、UserService、UserMapper.xml 文件

代码语言:txt
复制
package com.bi.cloud.dao;
代码语言:txt
复制
import com.bi.cloud.pojo.Users;
代码语言:txt
复制
import org.apache.ibatis.annotations.Mapper;
代码语言:txt
复制
@Mapper
代码语言:txt
复制
public interface UserDao {
代码语言:txt
复制
    Users getUsers(String username);
代码语言:txt
复制
}
代码语言:txt
复制
package com.bi.cloud.pojo;
代码语言:txt
复制
import lombok.Data;
代码语言:txt
复制
import java.io.Serializable;
代码语言:txt
复制
@Data
代码语言:txt
复制
public class Users implements Serializable {
代码语言:txt
复制
    private long id;
代码语言:txt
复制
    private String username;
代码语言:txt
复制
    private String password;
代码语言:txt
复制
}
代码语言:txt
复制
package com.bi.cloud.service;
代码语言:txt
复制
import com.bi.cloud.pojo.Users;
代码语言:txt
复制
public interface UserService {
代码语言:txt
复制
    Users userInfo(String username);
代码语言:txt
复制
}
代码语言:txt
复制
<?xml version="1.0" encoding="UTF-8"?>
代码语言:txt
复制
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
代码语言:txt
复制
<mapper namespace="com.bi.cloud.dao.UserDao">
代码语言:txt
复制
    <resultMap id="BaseResultMap" type="com.bi.cloud.pojo.Users">
代码语言:txt
复制
        <id column="id" property="id"/>
代码语言:txt
复制
        <result column="username" property="username"/>
代码语言:txt
复制
        <result column="password" property="password"/>
代码语言:txt
复制
    </resultMap>
代码语言:txt
复制
    <sql id="Base_Column_List">
代码语言:txt
复制
     id, username, password
代码语言:txt
复制
    </sql>
代码语言:txt
复制
    <select id="getUsers" resultMap="BaseResultMap">
代码语言:txt
复制
        select
代码语言:txt
复制
        <include refid="Base_Column_List"/>
代码语言:txt
复制
        from bi_user where username = #{username}
代码语言:txt
复制
    </select>
代码语言:txt
复制
</mapper>
十二、engine 子模块修改 UserServiceImpl.class 文件 (TestConsumerListener

为RocketMQ消息监听,我们现在用不到,所以在这里把项目中的RocketMQ Jar包、方法都已经注视掉了)

pom.xml修改

代码语言:txt
复制
<?xml version="1.0" encoding="UTF-8"?>
代码语言:txt
复制
<project xmlns="http://maven.apache.org/POM/4.0.0"
代码语言:txt
复制
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
代码语言:txt
复制
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
代码语言:txt
复制
    <parent>
代码语言:txt
复制
        <artifactId>bi-cloud</artifactId>
代码语言:txt
复制
        <groupId>com.bi.cloud</groupId>
代码语言:txt
复制
        <version>1.0-SNAPSHOT</version>
代码语言:txt
复制
    </parent>
代码语言:txt
复制
    <modelVersion>4.0.0</modelVersion>
代码语言:txt
复制
    <artifactId>engine</artifactId>
代码语言:txt
复制
    <dependencies>
代码语言:txt
复制
        <!--集成公共模块-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.bi.cloud</groupId>
代码语言:txt
复制
            <artifactId>common</artifactId>
代码语言:txt
复制
            <version>1.0-SNAPSHOT</version>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--nacos service discovery client依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--nacos config client 依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--spring cloud+dubbo 依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-dubbo</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.csp</groupId>
代码语言:txt
复制
            <artifactId>sentinel-apache-dubbo-adapter</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--rocketmq-->
代码语言:txt
复制
        <!--<dependency>
代码语言:txt
复制
            <groupId>org.apache.rocketmq</groupId>
代码语言:txt
复制
            <artifactId>rocketmq-spring-boot-starter</artifactId>
代码语言:txt
复制
            <version>2.1.1</version>
代码语言:txt
复制
        </dependency>-->
代码语言:txt
复制
    </dependencies>
代码语言:txt
复制
</project>

UserServiceImpl.class 修改

代码语言:txt
复制
package com.bi.cloud.service.Impl;
代码语言:txt
复制
import com.bi.cloud.dao.UserDao;
代码语言:txt
复制
import com.bi.cloud.pojo.Users;
代码语言:txt
复制
import com.bi.cloud.service.UserService;
代码语言:txt
复制
import org.apache.dubbo.config.annotation.Service;
代码语言:txt
复制
import org.springframework.beans.factory.annotation.Autowired;
代码语言:txt
复制
import org.springframework.stereotype.Component;
代码语言:txt
复制
@Service
代码语言:txt
复制
@Component
代码语言:txt
复制
public class UserServiceImpl implements UserService {
代码语言:txt
复制
    @Autowired
代码语言:txt
复制
    private UserDao userDao;
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public Users userInfo(String username) {
代码语言:txt
复制
        return userDao.getUsers(username);
代码语言:txt
复制
    }
代码语言:txt
复制
}

bootstrap.yml 配置文件

代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles:
代码语言:txt
复制
    active: test #默认运行环境
代码语言:txt
复制
---
代码语言:txt
复制
server:
代码语言:txt
复制
  port: 8001
代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles: test  #运行环境 + 命名空间名称
代码语言:txt
复制
  application:
代码语言:txt
复制
    name: bi-cloud-engine   #唯一名称
代码语言:txt
复制
  cloud:
代码语言:txt
复制
    nacos:
代码语言:txt
复制
      discovery:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: a60273f4-07fb-4568-82eb-d078a3b02107 #Nacos 命名空间ID
代码语言:txt
复制
      config:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: a60273f4-07fb-4568-82eb-d078a3b02107 #Nacos 命名空间ID
代码语言:txt
复制
        group: DEFAULT_GROUP  # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
代码语言:txt
复制
        file-extension: yml   #默认properties
代码语言:txt
复制
mybatis:
代码语言:txt
复制
  mapper-locations: classpath:mapper/*.xml
代码语言:txt
复制
---
代码语言:txt
复制
server:
代码语言:txt
复制
  port: 8001
代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles: pre  #运行环境 + 命名空间名称
代码语言:txt
复制
  application:
代码语言:txt
复制
    name: bi-cloud-engine   #唯一名称
代码语言:txt
复制
  cloud:
代码语言:txt
复制
    nacos:
代码语言:txt
复制
      discovery:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: c60d2198-0b2f-46c1-82cb-4c2f20fb8123 #Nacos 命名空间ID
代码语言:txt
复制
      config:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: c60d2198-0b2f-46c1-82cb-4c2f20fb8123 #Nacos 命名空间ID
代码语言:txt
复制
        group: DEFAULT_GROUP  # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
代码语言:txt
复制
        file-extension: yml   #默认properties
代码语言:txt
复制
mybatis:
代码语言:txt
复制
  mapper-locations: classpath:mapper/*.xml
代码语言:txt
复制
---
代码语言:txt
复制
server:
代码语言:txt
复制
  port: 8001
代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles: prd  #运行环境 + 命名空间名称
代码语言:txt
复制
  application:
代码语言:txt
复制
    name: bi-cloud-engine   #唯一名称
代码语言:txt
复制
  cloud:
代码语言:txt
复制
    nacos:
代码语言:txt
复制
      discovery:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: 0be74aa4-00e5-4c48-ae8c-34965c327212 #Nacos 命名空间ID
代码语言:txt
复制
      config:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: 0be74aa4-00e5-4c48-ae8c-34965c327212 #Nacos 命名空间ID
代码语言:txt
复制
        group: DEFAULT_GROUP  # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
代码语言:txt
复制
        file-extension: yml   #默认properties
代码语言:txt
复制
mybatis:
代码语言:txt
复制
  mapper-locations: classpath:mapper/*.xml

Nacos配置

代码语言:txt
复制
spring:
代码语言:txt
复制
  datasource:
代码语言:txt
复制
    driver-class-name: com.mysql.jdbc.Driver
代码语言:txt
复制
    url: jdbc:mysql://192.168.*.***:3306/*****?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
代码语言:txt
复制
    username: ****
代码语言:txt
复制
    password: ****
代码语言:txt
复制
    druid:
代码语言:txt
复制
      initialSize: 10
代码语言:txt
复制
      minIdle: 10
代码语言:txt
复制
      maxActive: 30
代码语言:txt
复制
      maxWait: 50000
代码语言:txt
复制
dubbo:
代码语言:txt
复制
  scan:
代码语言:txt
复制
    # dubbo 服务扫描基准包
代码语言:txt
复制
    base-packages: com.bi.cloud.service
代码语言:txt
复制
  protocol:
代码语言:txt
复制
    # dubbo 协议
代码语言:txt
复制
    name: dubbo
代码语言:txt
复制
    # dubbo 协议端口( -1 表示自增端口,从 20880 开始)
代码语言:txt
复制
    port: -1
代码语言:txt
复制
    host: 127.0.0.1
代码语言:txt
复制
  registry:
代码语言:txt
复制
    # 挂载到 Spring Cloud 的注册中心
代码语言:txt
复制
    address: spring-cloud://localhost
代码语言:txt
复制
rocketmq:
代码语言:txt
复制
  name-server: 192.168.1.***:9876
代码语言:txt
复制
  producer:
代码语言:txt
复制
    # 小坑:必须指定group
代码语言:txt
复制
    group: test-group

EngineApplication.class 启动类

代码语言:txt
复制
package com.bi.cloud;
代码语言:txt
复制
import org.mybatis.spring.annotation.MapperScan;
代码语言:txt
复制
import org.springframework.boot.SpringApplication;
代码语言:txt
复制
import org.springframework.boot.autoconfigure.SpringBootApplication;
代码语言:txt
复制
import org.springframework.boot.autoconfigure.domain.EntityScan;
代码语言:txt
复制
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
代码语言:txt
复制
@SpringBootApplication
代码语言:txt
复制
@EnableDiscoveryClient
代码语言:txt
复制
@EntityScan("com.bi.cloud.pojo")
代码语言:txt
复制
@MapperScan("com.bi.cloud.dao")
代码语言:txt
复制
public class EngineApplication {
代码语言:txt
复制
    public static void main(String[] args) {
代码语言:txt
复制
        SpringApplication.run(EngineApplication.class, args);
代码语言:txt
复制
    }
代码语言:txt
复制
}
十三、新增 api 子模块(TestProducerController 与 TestDemoController 为

RocketMQ,这里已经注释掉,不需要)

ResourceServerConfig.class

代码语言:txt
复制
package com.bi.cloud.config;
代码语言:txt
复制
import com.bi.cloud.handler.AuthExceptionEntryPoint;
代码语言:txt
复制
import org.springframework.beans.factory.annotation.Autowired;
代码语言:txt
复制
import org.springframework.beans.factory.annotation.Value;
代码语言:txt
复制
import org.springframework.context.annotation.Bean;
代码语言:txt
复制
import org.springframework.context.annotation.Configuration;
代码语言:txt
复制
import org.springframework.data.redis.connection.RedisConnectionFactory;
代码语言:txt
复制
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
代码语言:txt
复制
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
代码语言:txt
复制
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
代码语言:txt
复制
import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
代码语言:txt
复制
import org.springframework.security.oauth2.provider.token.RemoteTokenServices;
代码语言:txt
复制
import org.springframework.security.oauth2.provider.token.TokenStore;
代码语言:txt
复制
import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
代码语言:txt
复制
@Configuration
代码语言:txt
复制
@EnableResourceServer
代码语言:txt
复制
@EnableGlobalMethodSecurity(prePostEnabled = true)
代码语言:txt
复制
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
代码语言:txt
复制
    @Value("${security.oauth2.client.client-id}")
代码语言:txt
复制
    private String clientId;
代码语言:txt
复制
    @Value("${security.oauth2.client.client-secret}")
代码语言:txt
复制
    private String secret;
代码语言:txt
复制
    @Value("${security.oauth2.authorization.check-token-access}")
代码语言:txt
复制
    private String checkTokenEndpointUrl;
代码语言:txt
复制
    @Autowired
代码语言:txt
复制
    private RedisConnectionFactory redisConnectionFactory;
代码语言:txt
复制
    @Autowired
代码语言:txt
复制
    private AuthExceptionEntryPoint authExceptionEntryPoint;
代码语言:txt
复制
    @Bean
代码语言:txt
复制
    public TokenStore redisTokenStore() {
代码语言:txt
复制
        return new RedisTokenStore(redisConnectionFactory);
代码语言:txt
复制
    }
代码语言:txt
复制
    @Bean
代码语言:txt
复制
    public RemoteTokenServices tokenService() {
代码语言:txt
复制
        RemoteTokenServices tokenService = new RemoteTokenServices();
代码语言:txt
复制
        tokenService.setClientId(clientId);
代码语言:txt
复制
        tokenService.setClientSecret(secret);
代码语言:txt
复制
        tokenService.setCheckTokenEndpointUrl(checkTokenEndpointUrl);
代码语言:txt
复制
        return tokenService;
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void configure(ResourceServerSecurityConfigurer resources) {
代码语言:txt
复制
        resources.authenticationEntryPoint(authExceptionEntryPoint);
代码语言:txt
复制
    }
代码语言:txt
复制
}

UserBlockHandler.class

代码语言:txt
复制
package com.bi.cloud.config;
代码语言:txt
复制
import com.alibaba.csp.sentinel.slots.block.BlockException;
代码语言:txt
复制
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
代码语言:txt
复制
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
代码语言:txt
复制
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
代码语言:txt
复制
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
代码语言:txt
复制
import com.alibaba.csp.sentinel.slots.system.SystemBlockException;
代码语言:txt
复制
import com.alibaba.fastjson.JSON;
代码语言:txt
复制
import java.util.HashMap;
代码语言:txt
复制
public class UserBlockHandler {
代码语言:txt
复制
    public static String handleException(BlockException ex) {
代码语言:txt
复制
        HashMap<String, Object> map = new HashMap<>();
代码语言:txt
复制
        if (ex instanceof FlowException) {
代码语言:txt
复制
            map.put("code", -1);
代码语言:txt
复制
            map.put("msg", "系统限流,请稍等");
代码语言:txt
复制
        } else if (ex instanceof DegradeException) {
代码语言:txt
复制
            map.put("code", -2);
代码语言:txt
复制
            map.put("msg", "降级了");
代码语言:txt
复制
        } else if (ex instanceof ParamFlowException) {
代码语言:txt
复制
            map.put("code", -3);
代码语言:txt
复制
            map.put("msg", "热点参数限流");
代码语言:txt
复制
        } else if (ex instanceof SystemBlockException) {
代码语言:txt
复制
            map.put("code", -4);
代码语言:txt
复制
            map.put("msg", "系统规则(负载/...不满足要求)");
代码语言:txt
复制
        } else if (ex instanceof AuthorityException) {
代码语言:txt
复制
            map.put("code", -5);
代码语言:txt
复制
            map.put("msg", "授权规则不通过");
代码语言:txt
复制
        }
代码语言:txt
复制
        return JSON.toJSONString(map);
代码语言:txt
复制
    }
代码语言:txt
复制
    public static String handleError() {
代码语言:txt
复制
        HashMap<String, Object> map = new HashMap<>();
代码语言:txt
复制
        map.put("code", 500);
代码语言:txt
复制
        map.put("msg", "系统异常");
代码语言:txt
复制
        return JSON.toJSONString(map);
代码语言:txt
复制
    }
代码语言:txt
复制
}

UserController.class

代码语言:txt
复制
package com.bi.cloud.controller;
代码语言:txt
复制
import com.alibaba.csp.sentinel.annotation.SentinelResource;
代码语言:txt
复制
import com.alibaba.fastjson.JSON;
代码语言:txt
复制
import com.bi.cloud.config.UserBlockHandler;
代码语言:txt
复制
import com.bi.cloud.pojo.Users;
代码语言:txt
复制
import com.bi.cloud.service.UserService;
代码语言:txt
复制
import org.apache.dubbo.config.annotation.Reference;
代码语言:txt
复制
import org.springframework.security.core.context.SecurityContextHolder;
代码语言:txt
复制
import org.springframework.web.bind.annotation.PostMapping;
代码语言:txt
复制
import org.springframework.web.bind.annotation.RequestMapping;
代码语言:txt
复制
import org.springframework.web.bind.annotation.RestController;
代码语言:txt
复制
@RestController
代码语言:txt
复制
@RequestMapping("/api/user")
代码语言:txt
复制
public class UserController {
代码语言:txt
复制
    @Reference
代码语言:txt
复制
    private UserService userService;
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 获取用户信息
     */
    @PostMapping("/userInfo")
    public String userInfo() {
        String userName = SecurityContextHolder.getContext().getAuthentication().getName();
        return JSON.toJSONString(userService.userInfo(userName));
    }
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 测试流控规则
     */
    @PostMapping("/testFlow")
    @SentinelResource(value = "user-testFlow",
            blockHandlerClass = UserBlockHandler.class, //对应异常类
            blockHandler = "handleException",  //只负责sentinel控制台配置违规
            fallback = "handleError",   //只负责业务异常
            fallbackClass = UserBlockHandler.class)
    public String testFlow() {
        Users user = userService.userInfo("admin");
        return JSON.toJSONString(user);
    }
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 测试降级规则
     */
    @PostMapping("/testDegrade")
    @SentinelResource(value = "user-testDegrade",
            blockHandlerClass = UserBlockHandler.class, //对应异常类
            blockHandler = "handleException",  //只负责sentinel控制台配置违规
            fallback = "handleError",   //只负责业务异常
            fallbackClass = UserBlockHandler.class)
    public String testDegrade() {
        Users user = userService.userInfo("admin");
        return JSON.toJSONString(user);
    }
}

AuthExceptionEntryPoint.class (oauth登录异常处理)

代码语言:txt
复制
package com.bi.cloud.handler;
代码语言:txt
复制
import com.alibaba.fastjson.JSONObject;
代码语言:txt
复制
import lombok.extern.slf4j.Slf4j;
代码语言:txt
复制
import org.springframework.security.core.AuthenticationException;
代码语言:txt
复制
import org.springframework.security.oauth2.common.exceptions.InvalidTokenException;
代码语言:txt
复制
import org.springframework.security.web.AuthenticationEntryPoint;
代码语言:txt
复制
import org.springframework.stereotype.Component;
代码语言:txt
复制
import javax.servlet.http.HttpServletRequest;
代码语言:txt
复制
import javax.servlet.http.HttpServletResponse;
代码语言:txt
复制
import java.io.IOException;
代码语言:txt
复制
@Component
代码语言:txt
复制
@Slf4j
代码语言:txt
复制
public class AuthExceptionEntryPoint implements AuthenticationEntryPoint {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void commence(HttpServletRequest request, HttpServletResponse response,
代码语言:txt
复制
                         AuthenticationException authException) {
代码语言:txt
复制
        Throwable cause = authException.getCause();
代码语言:txt
复制
        response.setHeader("Content-Type", "application/json;charset=UTF-8");
代码语言:txt
复制
        try {
代码语言:txt
复制
            JSONObject body = new JSONObject();
代码语言:txt
复制
            body.put("code", 1001);
代码语言:txt
复制
            body.put("msg", "token无效");
代码语言:txt
复制
            if (!(cause instanceof InvalidTokenException)) {
代码语言:txt
复制
                body.put("code", 1002);
代码语言:txt
复制
                body.put("msg", "token丢失");
代码语言:txt
复制
            }
代码语言:txt
复制
            response.getWriter().write(body.toJSONString());
代码语言:txt
复制
        } catch (IOException e) {
代码语言:txt
复制
            log.error("token认证失败", e);
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
}

ApiApplication.class 启动类

代码语言:txt
复制
package com.bi.cloud;
代码语言:txt
复制
import org.springframework.boot.SpringApplication;
代码语言:txt
复制
import org.springframework.boot.autoconfigure.SpringBootApplication;
代码语言:txt
复制
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
代码语言:txt
复制
import org.springframework.context.annotation.ComponentScan;
代码语言:txt
复制
@SpringBootApplication
代码语言:txt
复制
@EnableDiscoveryClient
代码语言:txt
复制
public class ApiApplication {
代码语言:txt
复制
    public static void main(String[] args) {
代码语言:txt
复制
        SpringApplication.run(ApiApplication.class, args);
代码语言:txt
复制
    }
代码语言:txt
复制
}

bootstrap.yml 配置

代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles:
代码语言:txt
复制
    active: test
代码语言:txt
复制
---
代码语言:txt
复制
server:
代码语言:txt
复制
  port: 8003
代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles: test
代码语言:txt
复制
  application:
代码语言:txt
复制
    name: bi-cloud-api
代码语言:txt
复制
  cloud:
代码语言:txt
复制
    nacos:
代码语言:txt
复制
      discovery:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: a60273f4-07fb-4568-82eb-d078a3b02107 #Nacos 命名空间ID
代码语言:txt
复制
      config:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: a60273f4-07fb-4568-82eb-d078a3b02107 #Nacos 命名空间ID
代码语言:txt
复制
        group: DEFAULT_GROUP  # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
代码语言:txt
复制
        file-extension: yml   #默认properties
代码语言:txt
复制
---
代码语言:txt
复制
server:
代码语言:txt
复制
  port: 8003
代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles: pre
代码语言:txt
复制
  application:
代码语言:txt
复制
    name: bi-cloud-api
代码语言:txt
复制
  cloud:
代码语言:txt
复制
    nacos:
代码语言:txt
复制
      discovery:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: c60d2198-0b2f-46c1-82cb-4c2f20fb8123 #Nacos 命名空间ID
代码语言:txt
复制
      config:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: c60d2198-0b2f-46c1-82cb-4c2f20fb8123 #Nacos 命名空间ID
代码语言:txt
复制
        group: DEFAULT_GROUP  # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
代码语言:txt
复制
        file-extension: yml   #默认properties
代码语言:txt
复制
---
代码语言:txt
复制
server:
代码语言:txt
复制
  port: 8003
代码语言:txt
复制
spring:
代码语言:txt
复制
  profiles: prd
代码语言:txt
复制
  application:
代码语言:txt
复制
    name: bi-cloud-api
代码语言:txt
复制
  cloud:
代码语言:txt
复制
    nacos:
代码语言:txt
复制
      discovery:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: 0be74aa4-00e5-4c48-ae8c-34965c327212 #Nacos 命名空间ID
代码语言:txt
复制
      config:
代码语言:txt
复制
        server-addr: 127.0.0.1:8848  #Nacos 链接地址
代码语言:txt
复制
        namespace: 0be74aa4-00e5-4c48-ae8c-34965c327212 #Nacos 命名空间ID
代码语言:txt
复制
        group: DEFAULT_GROUP  # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
代码语言:txt
复制
        file-extension: yml   #默认properties

Nacos 配置

代码语言:txt
复制
dubbo:
代码语言:txt
复制
  registry:
代码语言:txt
复制
    # 挂载到 Spring Cloud 注册中心
代码语言:txt
复制
    address: spring-cloud://localhost
代码语言:txt
复制
  cloud:
代码语言:txt
复制
    # 订阅服务提供方的应用列表,订阅多个服务提供者使用 "," 连接
代码语言:txt
复制
    subscribed-services: bi-cloud-engine
代码语言:txt
复制
rocketmq:
代码语言:txt
复制
  name-server: 192.168.1.117:9876
代码语言:txt
复制
  producer:
代码语言:txt
复制
    # 小坑:必须指定group
代码语言:txt
复制
    group: test-group
代码语言:txt
复制
spring:
代码语言:txt
复制
  redis:
代码语言:txt
复制
    database: `
代码语言:txt
复制
    host: 192.168.1.206
代码语言:txt
复制
    port: 6379
代码语言:txt
复制
    password: root
代码语言:txt
复制
    timeout: 5000
代码语言:txt
复制
security:
代码语言:txt
复制
  oauth2:
代码语言:txt
复制
    client:
代码语言:txt
复制
      client-id: user-client
代码语言:txt
复制
      client-secret: user-secret-8888
代码语言:txt
复制
      user-authorization-uri: http://localhost:8002/oauth/authorize
代码语言:txt
复制
      access-token-uri: http://localhost:8002/oauth/token
代码语言:txt
复制
    resource:
代码语言:txt
复制
      id: user-client
代码语言:txt
复制
      user-info-uri: user-info
代码语言:txt
复制
    authorization:
代码语言:txt
复制
      check-token-access: http://localhost:8002/oauth/check_token

pom.xml 配置

代码语言:txt
复制
<?xml version="1.0" encoding="UTF-8"?>
代码语言:txt
复制
<project xmlns="http://maven.apache.org/POM/4.0.0"
代码语言:txt
复制
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
代码语言:txt
复制
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
代码语言:txt
复制
    <parent>
代码语言:txt
复制
        <artifactId>bi-cloud</artifactId>
代码语言:txt
复制
        <groupId>com.bi.cloud</groupId>
代码语言:txt
复制
        <version>1.0-SNAPSHOT</version>
代码语言:txt
复制
    </parent>
代码语言:txt
复制
    <modelVersion>4.0.0</modelVersion>
代码语言:txt
复制
    <artifactId>api</artifactId>
代码语言:txt
复制
    <dependencies>
代码语言:txt
复制
        <!--集成公共模块-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.bi.cloud</groupId>
代码语言:txt
复制
            <artifactId>common</artifactId>
代码语言:txt
复制
            <version>1.0-SNAPSHOT</version>
代码语言:txt
复制
            <exclusions>
代码语言:txt
复制
                <exclusion>
代码语言:txt
复制
                    <groupId>mysql</groupId>
代码语言:txt
复制
                    <artifactId>mysql-connector-java</artifactId>
代码语言:txt
复制
                </exclusion>
代码语言:txt
复制
                <exclusion>
代码语言:txt
复制
                    <groupId>org.mybatis.spring.boot</groupId>
代码语言:txt
复制
                    <artifactId>mybatis-spring-boot-starter</artifactId>
代码语言:txt
复制
                </exclusion>
代码语言:txt
复制
                <exclusion>
代码语言:txt
复制
                    <groupId>com.alibaba</groupId>
代码语言:txt
复制
                    <artifactId>druid-spring-boot-starter</artifactId>
代码语言:txt
复制
                </exclusion>
代码语言:txt
复制
            </exclusions>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--nacos service discovery client依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--nacos config client 依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--sentinel 核心环境 依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!-- Sentinel支持采用 Nacos 作为规则配置数据源,引入该适配依赖 -->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.csp</groupId>
代码语言:txt
复制
            <artifactId>sentinel-datasource-nacos</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.csp</groupId>
代码语言:txt
复制
            <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--spring cloud+dubbo 依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-dubbo</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>com.alibaba.csp</groupId>
代码语言:txt
复制
            <artifactId>sentinel-apache-dubbo-adapter</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!-- Java Servlet -->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>javax.servlet</groupId>
代码语言:txt
复制
            <artifactId>javax.servlet-api</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!--JSON 序列化依赖 和 模板引擎-->
代码语言:txt
复制
       <!-- <dependency>
代码语言:txt
复制
            <groupId>com.alibaba</groupId>
代码语言:txt
复制
            <artifactId>fastjson</artifactId>
代码语言:txt
复制
        </dependency>-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-starter-freemarker</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <!-- rocketmq -->
代码语言:txt
复制
        <!--<dependency>
代码语言:txt
复制
            <groupId>org.apache.rocketmq</groupId>
代码语言:txt
复制
            <artifactId>rocketmq-spring-boot-starter</artifactId>
代码语言:txt
复制
            <version>2.1.1</version>
代码语言:txt
复制
        </dependency>-->
代码语言:txt
复制
        <!--导入spring cloud oauth2依赖-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-starter-web</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.cloud</groupId>
代码语言:txt
复制
            <artifactId>spring-cloud-starter-oauth2</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-starter-data-redis</artifactId>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
    </dependencies>
代码语言:txt
复制
</project>

完整Naocs 列表展示

这里项目已经集成完毕

1. 启动项目

获取token

  • 假设咱们在一个 web 端使用,grant_type 是 password,表明这是使用 OAuth2 的密码模式。
  • username=admin 和 password=123456 就相当于在 web 端登录界面输入的用户名和密码,我们在认证服务端配置中固定了用户名是 admin 、密码是 123456,而线上环境中则应该通过查询数据库获取。
  • scope=all 是权限有关的,在认证服务的 OAuthConfig 中指定了 scope 为 all 。
  • Authorization 要加在请求头中,格式为 Basic 空格 base64(clientId:clientSecret),这个微服务客户端的 client-id 是 user-client,client-secret 是 user-secret-8888,将这两个值通过冒号连接,并使用 base64 编码(user-client:user-secret-8888)之后的值为 dXNlci1jbGllbnQ6dXNlci1zZWNyZXQtODg4OA==,可以通过 https://www.sojson.com/base64.html 在线编码获取。

POST http://localhost:8002/oauth/token?grant_type=password&username=admin&password=123456&scope=allundefined Accept: /undefined Cache-Control: no-cacheundefined Authorization: Basic dXNlci1jbGllbnQ6dXNlci1zZWNyZXQtODg4OA==

运行请求后,如果参数都正确的话,获取到的返回内容如下,是一段 json 格式

{undefined "access_token": "34f979d2-525f-4138-830d-dcbd7a2a5d02",undefined "token_type": "bearer",undefined "refresh_token": "98a9153b-6a98-4182-9af3-0a1321da7c0d",undefined "expires_in": 3599,undefined "scope": "all"undefined }

  • access_token : 就是之后请求需要带上的 token,也是本次请求的主要目的
  • token_type:为 bearer,这是 access token 最常用的一种形式
  • refresh_token:之后可以用这个值来换取新的 token,而不用输入账号密码
  • expires_in:token 的过期时间(秒)

换取 access_token

**token 过期后,用 refresh_token 换取 access_token

一般都会设置 access_token 的过期时间小于 refresh_token 的过期时间,以便在 access_token

过期后,不用用户再次登录的情况下,获取新的 access_token。**

POST http://localhost:8002/oauth/token?grant_type=refresh_token&refresh_token=706dac10-d48e-4795-8379-efe8307a2282undefined Accept: /undefined Cache-Control: no-cacheundefined Authorization: Basic dXNlci1jbGllbnQ6dXNlci1zZWNyZXQtODg4OA==

  • grant_type 设置为 refresh_token。
  • refresh_token 设置为请求 token 时返回的 refresh_token 的值。
  • 请求头加入 Authorization,格式依然是 Basic + 空格 + base64(client-id:client-secret)
  • 请求成功后会返回和请求 token 同样的数据格式。

请求获取当前登录用户信息接口

POST http://localhost:8008/bi- gateway/api/user/userInfoundefined Authorization: bearer 88d08a76-f4bf-4821-93ab-10eca7bdddb6

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 四种授权模式
    • 获取token
      • 换取 access_token
        • 请求获取当前登录用户信息接口
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档