这个作业属于哪个课程 | 2301-计算机学院-软件工程社区-CSDN社区云 |
---|---|
这个作业要求在哪里 | 团队作业——站立式会议+alpha冲刺-CSDN社区 |
这个作业的目标 | 记录alpha冲刺Day4 |
团队名称 | 熬夜会秃头 |
团队置顶集合随笔链接 | Alpha 冲刺随笔置顶(熬夜会秃头团队)-CSDN博客 |
目录
一、团队成员站立式会议总结
组员 | 昨天站立式会议到现在的进展 | 存在的问题/遇到的困难 | 今天到明天会议的安排 | 心得体会 |
陈少桐 | 把无法渲染的图片成功渲染,并且完成了子窗体页面 | 原生导航栏无法实现subnvue子窗体弹窗,需要变成自定义导航栏 | 解决导航栏问题 | 了解了subnuve的具体配置以及在vue页面的引用、nvue页面与vue页面的语法差异,以及pages.Json的配置问题。 |
梁菲汎 | 完成了用户界面 | 还未与其他界面进行交互,bucket管理以及存储量的扇形图还无法动态渲染 | 继续写页面 | 明白了该如何去利用css去制作折线图以及扇形图,对它的应用有了更深的理解,也对页面的排版更加得心应手。 |
陈知菲 | 使用Ribbon配置网关的负载均衡策略;Feign的优化、手动从Nacos获取服务列表功能的实现,Radis无中心化集群slot分配机制的模拟实现 | 使用Feign时报错”Method Not Allowed” 解决:导入HttpClient依赖,配置HttpClient连接池,遂正常运行 无法手动地从Nacos注册中心拉取服务列表 解决:上网搜索得知,NacosDiscoveryClient类可以获取服务与示例,遂注入DiscoveryClient(NacosDiscoveryClient的接口),获取服务信息 | 实现注册、桶删除、桶权限管理的功能 | 对Ribbon和spring的LoadBalancer两种负载均衡策略有了新的认识,了解了动态改变Feign的url的方法。 在学习负载均衡策略的过程中,我体会到分析框架源码的重要性。起初,我对Ribbon和LoadBalancer的机制与区别不是很了解,通过打断点跟踪源码执行,看到了从拉取服务列表到选择服务实例的全程,对整个框架架构的理解更进一步。 |
李恒欣 | 完善后端代码功能 | 需要较多时间完成不熟悉的工作 | 实现后端其他功能 | 对后端的学习已经有了一定的进展,仍需实践熟练 |
邱思源 | 对新实现的后端代码进行单元测试 | 测试的时候有些功能不熟悉 | 继续对后端代码进行单元测试 | 单元测试应该针对具体的功能或方法进行测试,而不是对整个类或模块进行测试。 |
宋芳鑫 | 完成404界面 | 404界面的出现条件需要更改 | 完成其他模块的交互功能 | 加深理解了Javascript的方法定义,在重定向的页面返回的HTTP状态码为“200”,表示URL有效。搜索引擎在搜索也会去爬取,反之则可以返回404界面 |
张一凡 | 对新实现的前端代码进行单元测试 | 前端测试的时候需要去询问并理解一下代码 | 继续对前端代码进行单元测试 | 每个测试用例应该只测试一个特定的功能或行为,这样可以避免测试用例之间的相互干扰。 |
林承桢 | 继续进行功能测试,完善测试文档 | 测试文档有些信息要有意义的进行整合 | 填写测试文档 | 重新审视了一下之前文档编写的漏洞,发现有些关于测试风险的没有书写,需要再去了解一下如何编写文档 |
黄才栋 | 完成创建bucket的交互功能 | 交互的时候用uni.switchtab导致交互不了,要改成uni.navigateTo | 完成其他模块的交互功能 | 编写代码效率有所提高,也对解决问题有了一定的理解。 |
谢怀广 | 核对新增代码规范并制作项目燃尽图 | 无 | 继续核对新增代码规范并制作项目燃尽图 | 通过核对代码规范自己也对前后端的知识有了一定的了解。 |
二、今日成果展示
权限管理的读写权限界面
subnvue的子页面配置
子页面弹出窗
创建bucket界面以及页面丢失情况
用户界面
<!-- Unnamed (矩形) -->
<div id="u753" class="ax_default _三级标题">
<div id="u753_div" class=""></div>
<div id="u753_text" class="text ">
<p><span>Bucket列表</span></p>
</div>
</div>
<!-- Unnamed (图片) -->
<div id="u754" class="ax_default image">
<img id="u754_img" class="img " src="@/assets/images/主界面/u123.png"/>
<div id="u754_text" class="text " style="display:none; visibility: hidden">
<p></p>
</div>
</div>
<!-- Unnamed (矩形) -->
<div id="u755" class="ax_default _三级标题">
<div id="u755_div" class=""></div>
<div id="u755_text" class="text ">
<p><span>权限管理</span></p>
</div>
</div>
<!-- Unnamed (图片) -->
<div id="u756" class="ax_default image">
<img id="u756_img" class="img " src="@/assets/images/主界面/u83.png"/>
<div id="u756_text" class="text " style="display:none; visibility: hidden">
<p></p>
</div>
</div>
<!-- Unnamed (矩形) -->
<div id="u757" class="ax_default _三级标题">
<div id="u757_div" class=""></div>
<div id="u757_text" class="text ">
<p><span>文件备份</span></p>
</div>
</div>
<!-- Unnamed (图片) -->
<div id="u758" class="ax_default image">
<img id="u758_img" class="img " src="@/assets/images/主界面/u85.png"/>
<div id="u758_text" class="text " style="display:none; visibility: hidden">
<p></p>
</div>
</div>
<!-- Unnamed (矩形) -->
<div id="u759" class="ax_default _三级标题">
<div id="u759_div" class=""></div>
<div id="u759_text" class="text ">
<p><span>基本设置</span></p>
</div>
</div>
<!-- Unnamed (热区) -->
<div id="u760" class="ax_default">
</div>
<!-- Unnamed (热区) -->
<div id="u761" class="ax_default">
</div>
<div id="u743_state1" class="panel_state" data-label="概览" style="visibility: hidden;">
<div id="u743_state1_content" class="panel_state_content">
<!-- Unnamed (矩形) -->
<div id="u765" class="ax_default box_1">
<img id="u765_img" class="img " src="@/assets/images/主界面/u71.svg"/>
<div id="u765_text" class="text " style="display:none; visibility: hidden">
<p></p>
</div>
</div>
<!-- Unnamed (矩形) -->
<div id="u766" class="ax_default box_1">
<img id="u766_img" class="img " src="@/assets/images/主界面/u72.svg"/>
<div id="u766_text" class="text " style="display:none; visibility: hidden">
<p></p>
</div>
</div>
<!-- Unnamed (矩形) -->
<div id="u767" class="ax_default box_1">
<img id="u767_img" class="img " src="@/assets/images/主界面/u72.svg"/>
<div id="u767_text" class="text " style="display:none; visibility: hidden">
<p></p>
</div>
</div>
<!-- Unnamed (矩形) -->
<div id="u770" class="ax_default box_1">
<img id="u770_img" class="img " src="@/assets/images/主界面/u72.svg"/>
<div id="u770_text" class="text " style="display:none; visibility: hidden">
<p></p>
</div>
</div>
<!-- Unnamed (图片) -->
<div id="u771" class="ax_default image">
<img id="u771_img" class="img " src="@/assets/images/主界面/u77.png"/>
<div id="u771_text" class="text " style="display:none; visibility: hidden">
<p></p>
</div>
</div>
<!-- Unnamed (图片) -->
<div id="u840" class="ax_default image">
<img id="u840_img" class="img " src="@/assets/images/主界面/u83.png"/>
<div id="u840_text" class="text " style="display:none; visibility: hidden">
<p></p>
</div>
</div>
<!-- Unnamed (矩形) -->
<div id="u841" class="ax_default _三级标题">
<div id="u841_div" class=""></div>
<div id="u841_text" class="text ">
<p><span>文件备份</span></p>
</div>
</div>
<!-- Unnamed (图片) -->
<div id="u842" class="ax_default image">
<img id="u842_img" class="img " src="@/assets/images/主界面/u169.png"/>
<div id="u842_text" class="text " style="display:none; visibility: hidden">
<p></p>
</div>
</div>
<!-- Unnamed (矩形) -->
<div id="u843" class="ax_default _三级标题">
<div id="u843_div" class=""></div>
<div id="u843_text" class="text ">
<p><span>基本设置</span></p>
</div>
</div>
网关的负载均衡策略配置(使用ribbon的WeightedResponseTimeRule——通过为服务器配置权重实现负载均衡)
user-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
基于feign和nacos实现对redis哈希槽的模拟(为之后去中心化集群节点间调用做准备)
Feign的url根据传入数据的哈希值动态配置
@FeignClient(name = "node01-service", url = "EMPTY")
public interface TestFeign {
@GetMapping("/bucket/test")
String test(URI uri, @RequestParam String str);
}
Feign拦截器——为通过feign调用的请求添加包含用户信息的请求头
@Component
public class FeignRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("id",
UserContextHolder.getContext().getProperty("id").toString());
requestTemplate.header("userEmail",
UserContextHolder.getContext().getProperty("userEmail").toString());
requestTemplate.header("nickName",
UserContextHolder.getContext().getProperty("nickName").toString());
requestTemplate.header("phoneNumber",
UserContextHolder.getContext().getProperty("phoneNumber").toString());
requestTemplate.header("picture",
UserContextHolder.getContext().getProperty("picture").toString());
requestTemplate.header("userStatus",
UserContextHolder.getContext().getProperty("userStatus").toString());
requestTemplate.header("type",
UserContextHolder.getContext().getProperty("type").toString());
}
}
Feign性能优化——使用httpclient连接池
从Nacos的DiscoveryClient编码获取服务列表
@Component
public class ServicesUtil {
@Autowired
private DiscoveryClient discoveryClient;
public List<ServiceInstance> getInstance(String serviceName) {
return discoveryClient.getInstances(serviceName);
}
public Integer getSlot(ServiceInstance instance) {
return Integer.parseInt(instance.getMetadata().get("slot"));
}
}
槽分配的具体实现
@Override
public String test(String str) {
int hashCode = str.hashCode();
hashCode %= 150;
if (hashCode >= slot && hashCode < slot + 50) {
return port;
}
List<ServiceInstance> instances = servicesUtil.getInstance("node01-service");
for (ServiceInstance instance : instances) {
Integer slot1 = servicesUtil.getSlot(instance);
if (hashCode >= slot1 && hashCode < slot1 + 50) {
try {
String uri = "http://" + instance.getHost() + ":" + instance.getPort();
return testFeign.test(new URI(uri), str);
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
}
return null;
}