# AvengersBack **Repository Path**: JokerPan12/avengers-back ## Basic Information - **Project Name**: AvengersBack - **Description**: Avengers后台 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-03-11 - **Last Updated**: 2023-05-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, SpringBoot, springscurity ## README # Avengers SpringBoot后端项目打包操作说明 1.修改`pom.xml`和`application.yml`: `pom.xml` [注释部分打包时取消注释] ``` 4.0.0 war org.springframework.boot spring-boot-starter-parent 2.1.6.RELEASE com.jokerpan jokerpanback 0.0.1-SNAPSHOT JokerPanBack JokerPans Project 1.8 org.springframework.boot spring-boot 2.1.6.RELEASE org.springframework.boot spring-boot-starter-jdbc 2.1.6.RELEASE org.springframework.boot spring-boot-starter-web 2.1.6.RELEASE org.springframework.boot spring-boot-autoconfigure 2.1.6.RELEASE com.alibaba druid-spring-boot-starter 1.1.9 com.alibaba druid 1.1.9 org.mybatis.spring.boot mybatis-spring-boot-starter 2.0.1 mysql mysql-connector-java 8.0.11 org.projectlombok lombok 1.18.16 org.aspectj aspectjweaver 1.9.4 org.springframework.boot spring-boot-maven-plugin org.projectlombok lombok org.apache.maven.plugins maven-compiler-plugin 8 8 src/main/java **/*.java src/main/resources **/*.* ``` `application.yml` [注释部分同上,打包前取消] ``` server: tomcat: uri-encoding: UTF-8 max-threads: 1000 min-spare-threads: 30 port: 8088 # servlet: # context-path: /jokerpanBack #这里填写与打包好的war包相同的名字 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://#服务器地址:#数据库端口【一般是3306】/#数据库名称?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false username: #数据库用户名 password: #数据库密码 initial-size: 10 max-active: 100 min-idle: 10 max-wait: 60000 pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 test-while-idle: true test-on-borrow: false test-on-return: false stat-view-servlet: enabled: true url-pattern: /druid/* filter: stat: log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config: multi-statement-allow: true # Mybatis配置 mybatis: mapperLocations: classpath:mapper/**/*.xml configuration: mapUnderscoreToCamelCase: true # 驼峰转换 ``` 2.在服务器中安装 tomcat 3.在maven界面-Lifecycle 下点击package打包成war包,打包后会在项目根目录-target下看到类似 【项目名-0.0.1-SNAPSHOT.war】这样的文件说明已经打包好了;然后可以重命名上传此文件到刚刚安 装好的tomcat文件夹/webapps下 4.用命令进入刚才安装的tomcat文件夹/bin目录下;运行`./startup.sh` 启动tomcat服务 5.使用 http://服务器地址:端口/刚才配置的context-path/ 就可以访问到后端接口了 # SpringBoot整合SpringCloud nacos 1.下载nacos压缩包 `https://github.com/alibaba/nacos.git` 2.上传到服务器中并解压到 `/usr/local/nacos`目录 3.用命令进入 `/usr/local/nacos/bin/` 目录下并运行 `./startup.sh -m standalone` 命令启动单机模式 4.浏览器输入 `http://ip:8848/nacos` 就可以访问到nacos主页面了,账号密码都是 `nacos`,访问前记得开放 `8848` nacos默认端口 5.在 `pom.xml` 中导入依赖: ``` 1.8 0.2.1 0.2.1 2.1.3.RELEASE 1.4.1 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config ${spring-cloud-starter-alibaba-nacos.version} com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery ${spring-cloud-starter-alibaba-nacos.version} 若因版本问题导致启动失败可尝试更改以下版本: org.springframework.boot spring-boot-starter-parent 2.1.9.RELEASE ``` 6.新增 `bootstrap.yml` 文件 ``` spring: application: name: @artifactId@ profiles: active: @profile.name@ cloud: nacos: #配置nacos命名空间与地址 config: namespace: @config.namespace@ #${config.namespace} server-addr: @config.server-addr@ #${config.server-addr} #读取文件类型 file-extension: yml # shared-dataids: application.yml # refreshable-dataids: application.yml username: @config.username@ #${config.username} password: @config.password@ #${config.password} #配置服务发现 discovery: namespace: @config.namespace@ #${config.namespace} server-addr: @discovery.server-addr@ #${discovery.server-addr} username: @config.username@ #${config.username} password: @config.password@ #${config.password} main: allow-bean-definition-overriding: true 以上 `@ @`符号指向 `pom.xml` 文件中的 `` dev true dev #nacos地址 public nacos nacos #nacos地址 #nacosIP on-line online #nacos地址 public nacos nacos #nacos地址 #nacosIP ``` 7.在nacos中新增开发环境以及线上环境的配置 ``` 在 Nacos Spring Cloud 中,dataId 的完整格式如下: ${prefix}-${spring.profiles.active}.${file-extension} prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。 spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension} file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。 ``` 8.配置完成后就可以删除 `application.yml` 文件了,不过还需在 `pom.xml` 配置扫描新增的 `bootstrap.yml` ``` src/main/java **/*.java src/main/resources **/*.* true ``` 9.Controller 可增加以下注解: ``` @RefreshScope //对Bean进行动态刷新,添加 @RefreshScope 或 @ConfigurationProperties注解。 public class UsersController { //可使用@Value获取nacos中的配置信息 @Value("${server.port}") public String port; ``` 10.配置nacos连接数据库: (1)进入 `/nacos/conf` 目录下; (2)使用 `nacos-mysql.sql` 文件初始化数据库; (3)编辑 `application.properties` 配置文件: ``` spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://ip:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=1234 ``` 11.重启nacos,进入主页面可新增命名空间,新增后可以在数据库 `tenant_info` 表中看见记录; 注:如果不能新增命名空间可以先清除浏览器缓存然后再试试; `如果在 pom.xml 使用新命名空间后加载不到配置可尝试更换为命名空间的 id; 例如:` ``` 44fedf1c-479a-4fc9-974f-b1049cad8e00 ``` 12.修改nacos登录密码: 一般安装nacos后登录密码默认都是nacos/nacos,但是在正式的生成环境这样肯定是不安全的; 查看nacos源码加密方式,nacos底层源码是BCryptPasswordEncoder加密器加密的: ``` package com.alibaba.nacos.console.utils; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** * Password encoder tool * * @author nacos */ public class PasswordEncoderUtil { public static void main(String[] args) { System.out.println(new BCryptPasswordEncoder().encode("nacos")); } public static Boolean matches(String raw, String encoded) { return new BCryptPasswordEncoder().matches(raw, encoded); } public static String encode(String raw) { return new BCryptPasswordEncoder().encode(raw); } } ``` 这样的话我们就可以用类似的方法去加密: `·导入Security的依赖` ``` org.springframework.boot spring-boot-starter-security ``` `·得到加密后的字符` ``` public class UserServerApplication { public static void main(String[] args) { System.out.println(new BCryptPasswordEncoder().encode("123456")); } } ``` ``` $2a$10$Ca5DCqgaiGHaZnlmxhbBZOoCyfJvt9tFAnlnUHEjOdlHxnVKDxf9W Process finished with exit code 0 ``` 然后在数据库中找到 `users` 表,然后把刚才得到的密文加进去; 当然如果想改默认账户 `nacos` 的密码直接在主页面右上角点击修改密码即可; 导入Security依赖后访问接口的话会需要权限登录,此时如果我们不需要权限功能的话可以禁用它: ``` @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) //禁用Spring-Security @EnableAutoConfiguration(exclude = {org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class}) ``` 记得改完用户名和密码要去 `pom.xml` 文件里更新。 # 整合阿里云OSS文件对象存储 1.在阿里云官网购买 `OSS` 服务; 2.创建 `Bucket` ,填写Bucket名称,选择地域,读写权限选择 `公共读` ,其他选项默认, 记住Bucket的 `endpoint`; 3.创建阿里云 API 密钥 `AccessKey`,记住 `AccessKey ID` 以及 `AccessKey Secret`; 4.在 `nacos` 中配置: ``` aliyun: oss: endpoint: oss-cn-guangzhou.aliyuncs.com accessKeyId: xxx accessKeySecret: xxx bucketName: #刚才创建Bucket的名称 ``` 5.创建阿里云对象存储配置类读取 `nacos` 中的配置 ``` /** * 阿里云对象存储配置类 * @author jokerpan */ @Configuration @ConfigurationProperties(prefix = "aliyun.oss") public class AliyunOssConfig { private String endpoint; private String accessKeyId; private String accessKeySecret; private String bucketName; public String getEndpoint() { return endpoint; } public void setEndpoint(String endpoint) { this.endpoint = endpoint; } ................ ``` 6.使用 `oss` 进行文件上传: ``` @Resource AliyunOssConfig aliyunOssConfig; /** * 保存至aliyun Oss * @param path * @param fileBytes * @return */ public boolean saveToOss(String path, byte[] fileBytes) { boolean ok = true; OSS ossClient = new OSSClientBuilder().build(aliyunOssConfig.getEndpoint(), aliyunOssConfig.getAccessKeyId(),aliyunOssConfig.getAccessKeySecret()); try { // 创建PutObjectRequest对象。 // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。 PutObjectRequest putObjectRequest = new PutObjectRequest(aliyunOssConfig.getBucketName(), path, new ByteArrayInputStream(fileBytes)); PutObjectResult res = ossClient.putObject(putObjectRequest); } catch (Exception e) { ok = false; e.printStackTrace(); } ossClient.shutdown(); return ok; } ``` 7.根据文件路径删除对应的文件(注:切忌文件路径已 `/` 或 '\' 开头): ``` public boolean deleteFile(String path) { boolean ok = true; path = path.split("com")[1].substring(1); // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(aliyunOssConfig.getEndpoint(), aliyunOssConfig.getAccessKeyId(),aliyunOssConfig.getAccessKeySecret()); try { // 判断文件是否存在 boolean found = ossClient.doesObjectExist(aliyunOssConfig.getBucketName(), path); if (found) { // 删除附件 ossClient.deleteObject(aliyunOssConfig.getBucketName(), path); } } catch (Exception e) { ok = false; e.printStackTrace(); } // 关闭OSSClient。 ossClient.shutdown(); return ok; } ``` 8.到这里就基本告一段落了,快去试试吧! # 整合Redis 1.服务器安装 `redis`; 2.在安装路径中找到redis配置文件 `redis.conf` 并进行如下修改: ``` (1) 找到bind 127.0.0.1并注释掉, 默认127.0.0.1只能本地访问,注释掉即可ip访问 (2) 修改 protected-mode 属性值为no, 保护模式禁用以后可以IP访问 (3) 修改daemonize属性将no 改为yes, 将daemonize设置为yes即启动后台运行 ``` 3.开放redis默认端口 `6379` 4.启动redis并测试连接: ``` redis-cli -h 192.168.126.129 -p 6379 ``` ``` root@JokerPanBase:/# redis-cli -h 120.24.168.122 -p 6379 120.24.168.122:6379> 以上代表连接成功! ``` 5.在 `nacos` 中配置: ``` #redis jedis配置 redis: #redis 数据库索引,默认为0 database: 0 #服务器地址 host: 120.24.168.122 #端口 port: 6379 #redis 服务器密码,默认为空 password: pool: #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: 30000 #连接池最大链接数 max-active: 200 #连接池中最大空闲链接 max-idle: 8 #连接池最小空闲链接 min-idle: 0 #链接超时 timeout: 0 ``` 6.在 `pom.xml` 加入依赖: ``` org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-cache ``` 7.增加redis配置类 ``` /** * @author jokerpan */ public class RedisConfig extends CachingConfigurerSupport { /** * 选择redis作为默认缓存工具 * @param redisConnectionFactory * @return */ @Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { // 设置缓存有效期一小时 RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(1)); return RedisCacheManager .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory)) .cacheDefaults(redisCacheConfiguration).build(); } /** * retemplate相关配置 * @param factory * @return */ @Bean public RedisTemplate redisTemplate(RedisConnectionFactory factory) { RedisTemplate template = new RedisTemplate<>(); // 配置连接工厂 template.setConnectionFactory(factory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jacksonSeial.setObjectMapper(om); // 值采用json序列化 template.setValueSerializer(jacksonSeial); //使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); // 设置hash key 和value序列化模式 template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(jacksonSeial); template.afterPropertiesSet(); return template; } /** * 对hash类型的数据操作 * * @param redisTemplate * @return */ @Bean public HashOperations hashOperations(RedisTemplate redisTemplate) { return redisTemplate.opsForHash(); } /** * 对redis字符串类型数据操作 * * @param redisTemplate * @return */ @Bean public ValueOperations valueOperations(RedisTemplate redisTemplate) { return redisTemplate.opsForValue(); } /** * 对链表类型的数据操作 * * @param redisTemplate * @return */ @Bean public ListOperations listOperations(RedisTemplate redisTemplate) { return redisTemplate.opsForList(); } /** * 对无序集合类型的数据操作 * * @param redisTemplate * @return */ @Bean public SetOperations setOperations(RedisTemplate redisTemplate) { return redisTemplate.opsForSet(); } /** * 对有序集合类型的数据操作 * * @param redisTemplate * @return */ @Bean public ZSetOperations zSetOperations(RedisTemplate redisTemplate) { return redisTemplate.opsForZSet(); } } ``` 8.测试redis缓存: ``` /** * redis 测试 */ public Users findUserById(Integer id){ String key = "user_" + id; ValueOperations operations = redisTemplate.opsForValue(); //判断redis中是否有键为key的缓存 boolean hasKey = redisTemplate.hasKey(key); Users users = usersMapper.queryById(id); if (!hasKey){ // 写入缓存 operations.set(key, users, 5, TimeUnit.HOURS); }else { //根据key删除 redisTemplate.delete(key); } return users; } ``` # 整合Spring Security 1.导入 `Security` 依赖, 数据库新建角色表、权限表等等 ``` org.springframework.boot spring-boot-starter-security org.springframework.security spring-security-config org.springframework.security spring-security-web ``` 2.配置 `SpringSecurity` ,自定义的处理逻辑详情请看项目中的 `Handler` 文件夹内 ``` package com.jokerpan.project.config; import com.jokerpan.project.Handler.*; import com.jokerpan.project.service.impl.UsersServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import javax.annotation.Resource; /** * SpringSecurity配置 * @author jokerpan */ @EnableWebSecurity //开启权限注解,默认是关闭的 @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { /** * 未登录 */ @Resource AuthenticationEnryPoint authenticationEnryPoint; /** * 登录成功 */ @Resource AuthenticationSuccess authenticationSuccess; /** * 登录失败 */ @Resource AuthenticationFailure authenticationFailure; /** * 注销 */ @Resource AuthenticationLogout authenticationLogout; /** * 无权访问 */ @Resource AccessDeny accessDeny; /** * 检测异地登录 */ @Resource SessionInformationExpiredStrategy sessionInformationExpiredStrategy; /** * 自定义认证逻辑处理 */ @Resource SelfAuthenticationProvider selfAuthenticationProvider; @Bean public UserDetailsService userDetailsService() { return new UsersServiceImpl(); } /** * 加密方式 */ @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } /** * 认证 */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(selfAuthenticationProvider); } /** * 授权 */ @Override protected void configure(HttpSecurity http) throws Exception { //cors()解决跨域问题,csrf()会与restful风格冲突,默认springsecurity是开启的,所以要disable()关闭一下 http.cors().and().csrf().disable(); // /index需要权限为ROLE_USER才能访问 /hello需要权限为ROLE_ADMIN才能访问 http.authorizeRequests() //开放注册接口允许所有人访问 .antMatchers("/users/register").permitAll() //hasAuthority 跟数据库权限保持一致【ROLE_ADMIN】而 hasRole则需要数据库中已ROLE开头 // .antMatchers("/users/*").hasAnyRole("ADMIN", "USER") // .antMatchers("/users/queryList").hasRole("USER") .and() //开启登录 .formLogin() //允许所有人访问 .permitAll() // 登录成功逻辑处理 .successHandler(authenticationSuccess) // 登录失败逻辑处理 .failureHandler(authenticationFailure) .and() //开启注销 .logout() //允许所有人访问 .permitAll() //注销逻辑处理 .logoutSuccessHandler(authenticationLogout) //删除cookie .deleteCookies("JSESSIONID") .and().exceptionHandling() //权限不足的时候的逻辑处理 .accessDeniedHandler(accessDeny) //未登录是的逻辑处理 .authenticationEntryPoint(authenticationEnryPoint) .and() .sessionManagement() //最多只能一个用户登录一个账号 .maximumSessions(1) //异地登录的逻辑处理 .expiredSessionStrategy(sessionInformationExpiredStrategy); } } ``` 3.查询用户信息实现类要实现 `UserDetailsService` 接口中的 `loadUserByUsername` 方法: ``` @Override public UserDetails loadUserByUsername(String loginName) throws UsernameNotFoundException { Users users = usersMapper.checkLoginName(loginName); if (users == null){ throw new UsernameNotFoundException("用户名错误!!"); } //获取用户权限,并把其添加到GrantedAuthority中 List grantedAuthorities=new ArrayList<>(); GrantedAuthority grantedAuthority=new SimpleGrantedAuthority(users.getRoleName()); grantedAuthorities.add(grantedAuthority); //方法的返回值要求返回UserDetails这个数据类型, UserDetails是接口,找它的实现类就好了 return new org.springframework.security.core.userdetails.User(loginName,users.getPassword(),grantedAuthorities); } 在这里说明一下:Security 中密码是通过 `BCryptPasswordEncoder()` 自带方法加密的,所以数据库中的密码最好也用这种加密方式不然就会判断密码错误 ``` 4.在这里踩一下坑,如果是前后端分离并且 `application.yml` 中配置了: ``` servlet: context-path: /jokerpanBack ``` 这个的话一定要在登录后返回 `JSESSIONID` 给前端并保存在 `cookie` 中,不然的话会获取不到当前登录用户: ``` @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { //登录成功时返回给前端的数据 Msg result=Msg.success("登录成功!!!!!",request.getSession().getId()); response.setContentType("application/json;charset=utf-8"); response.getWriter().write(gson.toJson(result)); } ``` 以下方法获取当前登录用户: ``` public Users getCurrentUser(Principal principal){ String username = principal.getName(); Users users = usersService.checkLoginName(username); return users; } ``` 5.最后可以自己配置接口的权限了,有两种方式: (1) 第一种,直接在 `SpringSecurityConfig` 中配置 ``` http.authorizeRequests() //开放注册接口允许所有人访问 .antMatchers("/users/register").permitAll() //hasAuthority 跟数据库权限保持一致【ROLE_ADMIN】而 hasRole则需要数据库中已ROLE开头 .antMatchers("/users/*").hasAnyRole("ADMIN", "USER") .antMatchers("/users/queryList").hasRole("USER") ``` (2) 第二种,使用注解方式配置,注解有很多在这里我就不一一列举了 ``` @PostMapping("/update") @PreAuthorize("hasAnyRole('ROLE_USER','ROLE_ADMIN')") public Map update(Users users) {} //权限注解 //表示只有admin权限才可访问 @Secured("ROLE_ADMIN") public List queryList() { return usersService.queryList(); } ``` # 整合Swagger 1.导入 `swagger` 依赖 ``` io.swagger swagger-annotations 1.5.20 io.springfox springfox-swagger2 2.9.2 io.springfox springfox-swagger-ui 2.9.2 ``` 2.配置 `swagger` ``` /** * @author jokerpan */ @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() //配置controller对应路径 .apis(RequestHandlerSelectors.basePackage("com.jokerpan.project.controller")) .paths(PathSelectors.any()).build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() //标题 .title("JokerPan-Api文档") //创建人 .contact(new Contact("JokerPan", "http://120.24.168.122", "jokerpan12@163.com")) //描述 .description("API文档") .termsOfServiceUrl("") .version("1.0").build(); } } ``` 3.在 `controller` 中增加Api注解 ``` @Api("用户操作Api") public class UsersController { private final Logger log = LoggerFactory.getLogger(this.getClass()); } ``` ``` @ApiOperation("查询所有用户") public List queryList() { return usersService.queryList(); } ``` 4.打开页面 `http://localhost:8088/swagger-ui.html#/` 就可以访问了 # 整合RabbitMq 1.安装 `RabbitMq` ,以我的服务器 `Ubuntu 16.04 64位` 为例: ``` .由于rabbitMq需要erlang语言的支持,在安装rabbitMq之前需要安装erlang,执行命令: apt-get install erlang-nox # 安装erlang erl # 查看relang语言版本,成功执行则说明relang安装成功 .添加公钥 wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add - .更新软件包 apt-get update .安装 RabbitMQ apt-get install rabbitmq-server #安装成功自动启动 .查看 RabbitMq状态 systemctl status rabbitmq-server #Active: active (running) 说明处于运行状态 # service rabbitmq-server status 用service指令也可以查看,同systemctl指令 .启动、停止、重启 service rabbitmq-server start # 启动 service rabbitmq-server stop # 停止 service rabbitmq-server restart # 重启 执行了上面的步骤,rabbitMq已经安装成功。 .启用 web端可视化操作界面,我们还需要配置Management Plugin插件 rabbitmq-plugins enable rabbitmq_management # 启用插件 service rabbitmq-server restart # 重启 .查看用户 rabbitmqctl list_users .添加管理用户 rabbitmqctl add_user admin yourpassword # 增加普通用户 [用户名:admin 密码: yourpassword] rabbitmqctl set_user_tags admin administrator # 给普通用户分配管理员角色 ``` 2.浏览器访问http:ip:15672就可以看到 `RabbitMq` 界面了,访问前记得开放 `15672` 端口