day13【前台】搭建环境

day13【前台】搭建环境

1、会员系统架构

image-20200930220645546

2、创建工程

2.1、工程清单

  • 父工程、 聚合工程: atcrowdfunding07-member-parent(唯一的 pom 工程)
  • 注册中心: atcrowdfunding08-member-eureka
  • 实体类模块: atcrowdfunding09-member-entity
  • MySQL 数据服务: atcrowdfunding10-member-mysql-provider
  • Redis 数据服务: atcrowdfunding11-member-redis-provider
  • 会员中心: atcrowdfunding12-member-authentication-consumer
  • 项目维护: atcrowdfunding13-member-project-consumer
  • 订单维护: atcrowdfunding14-member-order-consumer
  • 支付功能: atcrowdfunding15-member-pay-consumer
  • 网关: atcrowdfunding16-member-zuul
  • API 模块: atcrowdfunding17-member-api

2.2、创建工程

  • 父工程:创建Maven Projectparent工程打包方式为pom

image-20200625135749165

  • 其他工程:在parent下创建Maven Module,打包方式均为jarSpringBoot打包方式选择jar包,则使用自带的Tomcat

image-20200625135837614

2.3、工程结构

image-20200625140125710

2.4、搭建环境约定

2.5、包名约定

  • 主启动类所在的包:com.atguigu.crowd
  • 其他包都作为com.atguigu.crowd 的子包

2.6、主启动类约定

  • 主启动类类名为CrowdMainClass

2.7、端口号约定

atcrowdfunding08-member-eureka 					1000
atcrowdfunding10-member-mysql-provider 			2000
atcrowdfunding11-member-redis-provider 			3000
atcrowdfunding12-member-authentication-consumer 4000
atcrowdfunding13-member-project-consumer 		5000
atcrowdfunding14-member-order-consumer 			7000
atcrowdfunding15-member-pay-consumer 			8000
atcrowdfunding16-member-zuul 					80

3、parent工程

3.1、依赖管理

  • 在父工程中统一管理依赖的版本

image-20200625140454790

<!-- 配置在父工程中要管理的依赖 -->
<dependencyManagement>
    <dependencies>
        <!-- 导入SpringCloud需要使用的依赖信息 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR2</version>
            <type>pom</type>
            <!-- import依赖范围表示将spring-cloud-dependencies包中的依赖信息导入 -->
            <scope>import</scope>
        </dependency>
        <!-- 导入SpringBoot需要使用的依赖信息 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.6.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.5</version>
        </dependency>
    </dependencies>
</dependencyManagement>

4、Eureka注册中心

4.1、引入依赖

  • Eureka工程引入eureka-server的依赖

image-20200625141837140

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

4.2、创建主启动类

  • @EnableEurekaServer注解:启用Eureka服务器端功能

image-20200625141958407

@EnableEurekaServer
@SpringBootApplication
public class CrowdMainClass {
	
	public static void main(String[] args) {
		SpringApplication.run(CrowdMainClass.class, args);
	}

}

4.3、创建yml配置文件

image-20200625142110318

server:
  port: 1000
spring:
  application:
    name: atguigu-crowd-eureka
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

4.4、测试

  • 访问:http://localhost:1000/

image-20200625142228301

5、entity工程

5.1、实体类的细分

  • VOView Object视图对象 ,用于与浏览器页面打交道

    • 用途 1: 接收浏览器发送过来的数据
    • 用途 2: 把数据发送给浏览器去显示
  • POPersistent Object 持久化对象,用于与数据库打交道

    • 用途 1: 将数据封装到 PO 对象存入数据库
    • 用途 2: 将数据库数据查询出来存入 PO 对象
    • 所以 PO 对象是和数据库表对应, 一个数据库表对应一个 PO 对象

5.2、创建包

  • entity工程下创建
    • com.atguigu.crowd.entity.po
    • com.atguigu.crowd.entity.vo

image-20200625150029898

6、lombok

6.1、lombok 原理

image-20200930220734290

6.2、lombok安装

6.2.1、引入依赖
  • entity工程引入lombok的依赖

image-20200625180424324

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>
6.2.2、lombok jar包
  • Maven仓库中找到lombok.jar

image-20200625180530758

6.2.3、安装
  • lombok.jar复制到STS安装目录

image-20200625180609592

  • 双击运行lombok.jar,指定STS.exe程序所在位置,然后执行安装(更新)

image-20200625180857046

  • 安装完成后,关注如下两个文件
    • 多了一个lombok.jar文件,其实就是将lombok-1.18.8.jar复制了一份,然后改了个名字
    • STS.ini配置文件也被修改了

image-20200625180956024

  • STS.ini配置文件最后一行:指定lombok.jar包所在的位置
-startup
plugins/org.eclipse.equinox.launcher_1.5.500.v20190715-1310.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.1100.v20190907-0426
-product
org.springsource.sts.ide
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.8
-Xms256m
-Xmx1024m
-XX:+UseG1GC
-XX:+UseStringDeduplication
--add-modules=ALL-SYSTEM
-Dosgi.module.lock.timeout=10
-javaagent:D:\JavaTools\sts-bundle\sts-3.9.10.RELEASE\lombok.jar

6.3、lombok测试

6.3.1、注解
  • @Data:每一个字段都加入getXxx()setXxx()toString()方法
  • @ToStringtoString()方法
  • @NoArgsConstructor:无参构造器
  • @AllArgsConstructor:全部字段都包括的构造器
  • @EqualsAndHashCodeequalshashCode 方法
  • @Getter
    • 类:所有字段都加入getXxx()方法
    • 字段:当前字段加入getXxx()`方法
  • @Setter
    • 类:所有字段都加入setXxx()方法
    • 字段: 当前字段加入setXxx()方法
6.3.2、常用组合
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee{
6.3.3、常见问题
  • 安装完成后,重启STS,如果按照安装说明正确安装,并且提示安装成功,重启后依然编译报错的话
    • 将路径修改为相对路径-javaagent:lombok.jar
    • 请右键STS.exe选择以管理员身份运行。
  • 莫名其妙报错:注解删了,重新写一遍

7、mysql-provider工程

7.1、创建数据库表

  • 创建t_member表,用于存储会员信息

image-20200625195741576

CREATE TABLE t_member (
  id INT (11) NOT NULL AUTO_INCREMENT,
  loginacct VARCHAR (255) NOT NULL,
  userpswd CHAR(200) NOT NULL,
  username VARCHAR (255),
  email VARCHAR (255),
  authstatus INT (4) COMMENT 	'实名认证状态 0 - 未实名认证, 1 - 实名认证申请中, 2 - 已实名认证',
  usertype INT (4) COMMENT 		'0 - 个人, 1 - 企业',
  realname VARCHAR (255),
  cardnum VARCHAR (255),
  accttype INT (4) COMMENT 		'0 - 企业, 1 - 个体, 2 - 个人, 3 - 政府',
  PRIMARY KEY (id)
) ;

7.2、逆向工程

  • 借助reverse工程逆向生成,并把相应资源归位、

image-20200625195936043

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
	<!-- mybatis-generator:generate -->
	<context id="atguiguTables" targetRuntime="MyBatis3">
		<commentGenerator>
			<!-- 是否去除自动生成的注释 true:是;false:否 -->
			<property name="suppressAllComments" value="true" />
		</commentGenerator>
		<!--数据库连接的信息: 驱动类、 连接地址、 用户名、 密码 -->
		<jdbcConnection driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://localhost:3306/project_crowd"
			userId="root" password="101713">
		</jdbcConnection>
		<!-- 默认 false, 把 JDBC DECIMAL 和 NUMERIC 类型解析为 Integer, 为 true 时把 JDBC DECIMAL 
			和 NUMERIC 类型解析为 java.math.BigDecimal -->
		<javaTypeResolver>
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>
		<!-- targetProject:生成 Entity 类的路径 -->
		<javaModelGenerator targetProject=".\src\main\java"
			targetPackage="com.atguigu.crowd.entity">
			<!-- enableSubPackages:是否让 schema 作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
			<!-- 从数据库返回的值被清理前后的空格 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>
		<!-- targetProject:XxxMapper.xml 映射文件生成的路径 -->
		<sqlMapGenerator targetProject=".\src\main\java"
			targetPackage="com.atguigu.crowd.mapper">
			<!-- enableSubPackages:是否让 schema 作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</sqlMapGenerator>
		<!-- targetPackage: Mapper 接口生成的位置 -->
		<javaClientGenerator type="XMLMAPPER"
			targetProject=".\src\main\java"
			targetPackage="com.atguigu.crowd.mapper">
			<!-- enableSubPackages:是否让 schema 作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</javaClientGenerator>
		<!-- 数据库表名字和我们的 entity 类对应的映射指定 -->
		<table tableName="t_member" domainObjectName="MemberPO" />
	</context>
</generatorConfiguration>
  • 将实体类归位至entity工程下,MemberPO实体类使用lombok注解标记

image-20200625200225890

@NoArgsConstructor
@AllArgsConstructor
@Data
public class MemberPO {
    private Integer id;

    private String loginacct;

    private String userpswd;

    private String username;

    private String email;

    private Integer authstatus;

    private Integer usertype;

    private String realname;

    private String cardnum;

    private Integer accttype;
  • Mapper接口归位至mysql-provider工程下(这步会报错,因为Mapper接口需要用到entity工程中的实体类,然而现在mysql-provider工程并没有依赖entity工程,添加以来之后报错就会消失)

image-20200625200741036

  • Mapper.xml映射文件归位至mysql-provider工程下

image-20200625200831963

7.3、引入依赖

  • 添加相关依赖:
    • 数据库相关依赖
    • 需要对外暴露服务,添加web依赖
    • 服务需要注册进Eureka里面,添加eureka-client依赖
    • 需要使用实体类和工具类,添加对entity工程和common-util工程的依赖

image-20200625200955195

<dependencies>
    <!-- 整合MyBatis -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
    </dependency>

    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!-- 数据库连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
    </dependency>

    <!-- SpringBoot测试 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- 对外暴露服务 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- 作为客户端访问Eureka注册中心 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <!-- 为了能够使用实体类 -->
    <dependency>
        <groupId>com.atguigu.crowd</groupId>
        <artifactId>atcrowdfunding09-member-entity</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

    <!-- 为了能够使用工具类 -->
    <dependency>
        <groupId>com.atguigu.crowd</groupId>
        <artifactId>atcrowdfunding05-common-util</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

7.4、创建主启动类

  • 指定Mapper接口所在包

image-20200625201412124

// 扫描MyBatis的Mapper接口所在的包
@MapperScan("com.atguigu.crowd.mapper")
@SpringBootApplication
public class CrowdMainClass {
	
	public static void main(String[] args) {
		SpringApplication.run(CrowdMainClass.class, args);
	}

}

7.5、创建yml配置文件

  • 配置端口号
  • 配置微服务名称
  • 配置数据源
  • 指定Eureka注册中心的地址
  • 指定Mapper映射文件的地址
  • 修改局部日志级别

image-20200625201521285

server:
  port: 2000
spring:
  application:
    name: atguigu-crowd-mysql
  datasource:
    name: mydb
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://127.0.0.1:3306/project_crowd?serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1000/eureka
mybatis:
  mapper-locations: classpath*:/mybatis/mapper/*Mapper.xml
logging:
  level:
    com.atguigu.crowd.mapper: debug
    com.atguigu.crowd.test: debug

7.6、测试Mapper

  • 新建测试类

image-20200625203300037

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyBatisTest {
	
	@Autowired
	private DataSource dataSource;
	
	@Autowired
	private MemberPOMapper memberPOMapper;
	
	private Logger logger = LoggerFactory.getLogger(MyBatisTest.class);
	
	@Test
	public void testConnection() throws SQLException {
		
		Connection connection = dataSource.getConnection();
		
		logger.debug(connection.toString());
	}
	
	@Test
	public void testMapper() {
		
		BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
		
		String source = "123123";
		
		String encode = passwordEncoder.encode(source);
		
		MemberPO memberPO = new MemberPO(null, "jack", encode, "杰克", "jack@qq.com", 1, 1, "杰克", "123123", 2);
		
		memberPOMapper.insert(memberPO);
	}
	
}
  • 测试数据库连接
2020-06-25 20:33:50.107 DEBUG 24484 --- [           main] com.atguigu.crowd.test.MyBatisTest       : com.mysql.cj.jdbc.ConnectionImpl@f9cab00
  • 测试Mapper insert

image-20200625203525359

7.7、api工程中暴露接口

7.7.1、引入依赖
  • api工程中引入依赖
    • 通过feign实现远程调用,则需要添加openfeign依赖
    • 需要使用实体类和工具类,添加对entity工程和common-util工程的依赖

image-20200625211731355

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <dependency>
        <groupId>com.atguigu.crowd</groupId>
        <artifactId>atcrowdfunding05-common-util</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.atguigu.crowd</groupId>
        <artifactId>atcrowdfunding09-member-entity</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>
7.7.2、创建接口
  • 创建远程调用接口

image-20200625211940786

@FeignClient("atguigu-crowd-mysql")
public interface MySQLRemoteService {
	
	@RequestMapping("/get/memberpo/by/login/acct/remote")
	ResultEntity<MemberPO> getMemberPOByLoginAcctRemote(@RequestParam("loginacct") String loginacct);

}

7.8、provider中实现接口

7.8.1、创建Handler
  • mysql-provider工程的Handler中,实现远程调用接口

image-20200625212140866

@RestController
public class MemberProviderHandler {
	
	@Autowired
	private MemberService memberService;
	
	@RequestMapping("/get/memberpo/by/login/acct/remote")
	public ResultEntity<MemberPO> getMemberPOByLoginAcctRemote(@RequestParam("loginacct") String loginacct) {
		
		try {
			
			// 1.调用本地Service完成查询
			MemberPO memberPO = memberService.getMemberPOByLoginAcct(loginacct);
			
			// 2.如果没有抛异常,那么就返回成功的结果
			return ResultEntity.successWithData(memberPO);
		} catch (Exception e) {
			e.printStackTrace();
			
			// 3.如果捕获到异常则返回失败的结果
			return ResultEntity.failed(e.getMessage());
		}
		
	}

}
7.8.2、创建Service
  • Service层,实现Handler调用的方法

image-20200625212236304

// 在类上使用@Transactional(readOnly = true)针对查询操作设置事务属性
@Transactional(readOnly = true)
@Service
public class MemberServiceImpl implements MemberService {
	
	@Autowired
	private MemberPOMapper memberPOMapper;

	@Override
	public MemberPO getMemberPOByLoginAcct(String loginacct) {
		
		// 1.创建Example对象
		MemberPOExample example = new MemberPOExample();
		
		// 2.创建Criteria对象
		Criteria criteria = example.createCriteria();
		
		// 3.封装查询条件
		criteria.andLoginacctEqualTo(loginacct);
		
		// 4.执行查询
		List<MemberPO> list = memberPOMapper.selectByExample(example);
		
		// 5.获取结果
		if (list == null || list.size() == 0) {
			return null;
		}

		return list.get(0);
	}

}

7.9、测试mysql-provider

  • 访问:http://localhost:2000/get/memberpo/by/login/acct/remote?loginacct=jack

image-20200625212409436

8、redis-provider工程

8.1、引入依赖

  • redis-provider工程的pom文件中引入相关依赖
    • redis starter:整合Redis
    • 需要对外暴露服务:web的依赖
    • 需要注册进Eureka服务注册中心:eureka-client的依赖
    • 实体类和工具类的依赖

image-20200626211205476

<dependencies>
    <!-- 整合Redis -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <!-- 测试 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- 对外暴露服务 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- 作为客户端访问Eureka注册中心 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <!-- 为了能够使用实体类 -->
    <dependency>
        <groupId>com.atguigu.crowd</groupId>
        <artifactId>atcrowdfunding09-member-entity</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

    <!-- 为了能够使用工具类 -->
    <dependency>
        <groupId>com.atguigu.crowd</groupId>
        <artifactId>atcrowdfunding05-common-util</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

8.2、创建主启动类

image-20200626211545329

@SpringBootApplication
public class CrowdMainClass {
	
	public static void main(String[] args) {
		SpringApplication.run(CrowdMainClass.class, args);
	}

}

8.3、创建yml配置文件

  • 指定redis hostredis主机地址
  • 端口号使用默认的6379

image-20200626211719253

server:
  port: 3000
spring:
  application:
    name: atguigu-crowd-redis
  redis:
    host: 192.168.152.129
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1000/eureka

8.4、测试Redis

8.4.1、创建测试类

image-20200626211940899

@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {
	
	// private Logger logger = LoggerFactory.getLogger(RedisTest.class);
	
	@Autowired
	private StringRedisTemplate redisTemplate;
	
	@Test
	public void testSet() {
		ValueOperations<String, String> operations = redisTemplate.opsForValue();
		
		operations.set("apple", "red");
	}
	
	@Test
	public void testExSet() {
		ValueOperations<String, String> operations = redisTemplate.opsForValue();
		
		operations.set("banana", "yellow", 5000, TimeUnit.SECONDS);
	}

}
8.4.2、测试结果
  • 设置永不超时的key value键值对

image-20200626212218339

  • 设置带超时的key value键值对

image-20200626212321955

8.5、api工程中暴露接口

  • 设置永不超时的key value键值对
  • 设置带超时的key value键值对
  • 获取指定keyvalue
  • 删除指定的key

image-20200626212408145

@FeignClient("atguigu-crowd-redis")
public interface RedisRemoteService {
	
	@RequestMapping("/set/redis/key/value/remote")
	ResultEntity<String> setRedisKeyValueRemote(
			@RequestParam("key") String key, 
			@RequestParam("value") String value);
	
	@RequestMapping("/set/redis/key/value/remote/with/timeout")
	ResultEntity<String> setRedisKeyValueRemoteWithTimeout(
			@RequestParam("key") String key, 
			@RequestParam("value") String value,
			@RequestParam("time") long time,
			@RequestParam("timeUnit") TimeUnit timeUnit);
	
	@RequestMapping("/get/redis/string/value/by/key/remote")
	ResultEntity<String> getRedisStringValueByKeyRemote(@RequestParam("key") String key);

	@RequestMapping("/remove/redis/key/remote")
	ResultEntity<String> removeRedisKeyRemote(@RequestParam("key") String key);
	
}

8.6、provider中实现接口

  • redis-provider工程的Handler中,实现远程调用接口

image-20200626212619760

@RestController
public class RedisHandler {
	
	@Autowired
	private StringRedisTemplate redisTemplate;
	
	@RequestMapping("/set/redis/key/value/remote")
	ResultEntity<String> setRedisKeyValueRemote(
			@RequestParam("key") String key, 
			@RequestParam("value") String value) {
		
		try {
			ValueOperations<String, String> operations = redisTemplate.opsForValue();
			
			operations.set(key, value);
			
			return ResultEntity.successWithoutData();
		} catch (Exception e) {
			e.printStackTrace();
			
			return ResultEntity.failed(e.getMessage());
		}
		
	}
	
	@RequestMapping("/set/redis/key/value/remote/with/timeout")
	ResultEntity<String> setRedisKeyValueRemoteWithTimeout(
			@RequestParam("key") String key, 
			@RequestParam("value") String value,
			@RequestParam("time") long time,
			@RequestParam("timeUnit") TimeUnit timeUnit) {
		
		try {
			ValueOperations<String, String> operations = redisTemplate.opsForValue();
			
			operations.set(key, value, time, timeUnit);
			
			return ResultEntity.successWithoutData();
		} catch (Exception e) {
			e.printStackTrace();
			
			return ResultEntity.failed(e.getMessage());
		}
	}
	
	@RequestMapping("/get/redis/string/value/by/key/remote")
	ResultEntity<String> getRedisStringValueByKeyRemote(@RequestParam("key") String key) {
		
		try {
			ValueOperations<String, String> operations = redisTemplate.opsForValue();
			
			String value = operations.get(key);
			
			return ResultEntity.successWithData(value);
		} catch (Exception e) {
			e.printStackTrace();
			
			return ResultEntity.failed(e.getMessage());
		}
		
	}

	@RequestMapping("/remove/redis/key/remote")
	ResultEntity<String> removeRedisKeyRemote(@RequestParam("key") String key) {
		try {
			
			redisTemplate.delete(key);
			
			return ResultEntity.successWithoutData();
			
		} catch (Exception e) {
			e.printStackTrace();
			
			return ResultEntity.failed(e.getMessage());
		}
	}

}

8.7、测试redis-provider

  • 设置永不超时的key value键值对
http://localhost:3000/set/redis/key/value/remote?key=orange&value=orange

image-20200626213752949

image-20200626212951318

  • 设置带超时的key value键值对:
http://localhost:3000/set/redis/key/value/remote/with/timeout?key=peach&value=pink&time=5000&timeUnit=SECONDS

image-20200626213736764

image-20200626213814729

  • 获取指定keyvalue
http://localhost:3000/get/redis/string/value/by/key/remote?key=orange

image-20200626213949059

  • 删除指定的key
http://localhost:3000/remove/redis/key/remote?key=peach

image-20200626214033799

9、auth工程

9.1、引入依赖

image-20200626221428179

<dependencies>
    <!-- 标配web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- 整合thymeleaf -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <!-- eureka-client的依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <!-- api工程的依赖  -->
    <dependency>
        <groupId>com.atguigu.crowd</groupId>
        <artifactId>atcrowdfunding17-member-api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

    <!-- 热部署 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-loader</artifactId>
    </dependency>
</dependencies>

9.2、创建主启动类

  • 启用服务注册发现功能,这样才能找到provider哟~

image-20200626221549501

@EnableDiscoveryClient
@SpringBootApplication
public class CrowdMainClass {
	
	public static void main(String[] args) {
		SpringApplication.run(CrowdMainClass.class, args);
	}

}

9.3、创建yml配置文件

  • 配置thymeleaf视图解析器

image-20200626221642572

server:
  port: 4000
spring:
  application:
    name: atguigu-crowd-auth
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1000/eureka

9.4、创建Handler

  • 访问【域名+80端口】、,则直接转发至首页

image-20200626221744532

@Controller
public class PortalHandler {
	
	@RequestMapping("/")
	public String showPortalPage() {
		
		// 这里实际开发中需要加载数据……
		
		return "portal";
	}

}

9.5、调整页面

9.5.1、添加静态资源

image-20200626221947616

9.5.2、首页的小修小改

image-20200626222136898

<!DOCTYPE html>
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<base th:href="@{/}"/>
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="css/font-awesome.min.css">
<link rel="stylesheet" href="css/carousel.css">

9.6、测试

  • 成功访问(虽然是假数据)

image-20200626222217145

10、zuul工程

10.1、引入依赖

  • 需要注册进Eureka里面:添加eureka-client的依赖
  • 网关当然要添加zuul的依赖咯~

image-20200626230722091

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
</dependencies>

10.2、创建主启动类

  • @EnableZuulProxy启用网关功能

image-20200626230911689

@EnableZuulProxy
@SpringBootApplication
public class CrowdMainClass {
	
	public static void main(String[] args) {
		SpringApplication.run(CrowdMainClass.class, args);
	}

}

10.3、创建yml配置文件

  • 端口号配置为80,访问时就不需要写端口号啦~
  • ignored-services: "*":忽略微服务的真实名称
  • sensitive-headers: "*":重定向时保持原本头信息
  • service-id: atguigu-crowd-auth:访问zuul网关微服务时转接至auth微服务
  • path: /**:任意多层路径均可访问

image-20200626231009724

server:
  port: 80
spring:
  application:
    name: atguigu-crowd-zuul
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1000/eureka
zuul:
  ignored-services: "*"
  sensitive-headers: "*"  # 在Zuul向其他微服务重定向时保持原本头信息(请求头、响应头)
  routes:
    crowd-portal:
      service-id: atguigu-crowd-auth
      path: /**           # 这里一定要使用两个“*”号,不然“/”路径后面的多层路径将无法访问

10.4、配置域名

  • 推荐软件:SwitchHost

image-20200626232030652

10.5、测试

  • Eureka中注册的微服务

image-20200626231937217

  • 访问:http://www.crowd.com/

image-20200626231958876

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值