网络彩票的网站怎么做,腾讯邮箱网页版登录入口,上海平面设计公司排行榜,wordpress获取文章详情微服务架构
正常的小项目就是所有的功能集成在一个模块中#xff0c;这样代码之间不仅非常耦合#xff0c;而且修改处理的时候也非常的麻烦#xff0c;应对高并发时也不好处理#xff0c;所以 我们可以使用微服务架构#xff0c;对项目进行模块之间的拆分#xff0c;每一…微服务架构
正常的小项目就是所有的功能集成在一个模块中这样代码之间不仅非常耦合而且修改处理的时候也非常的麻烦应对高并发时也不好处理所以 我们可以使用微服务架构对项目进行模块之间的拆分每一个微服务负责一部分的业务功能处理也比较方便。 springcolud 集成了微服务的很多组件可以达到我们对微服务的使用
微服务拆分原则
我们对项目拆分是有原则的比如一个小项目我们前期可以先写出来然后后期慢慢拆分但是如果是大项目刚开始就设计好了微服务那么我们就可以在项目开始进行微服务的拆分
微服务拆分的时候各个模块需要 高内聚低耦合 拆分方法
拆分的时候 可以 使用完全解耦的拆分就是每个微服务项目都是一个独立的工程项目完全解耦但是管理比较麻烦 还可以使用maven聚合的拆分维护方便但是服务之间耦合编译比较耗时
maven聚合形式如何拆分 就是把不同功能模块的代码抽取到一个新模块中去 例如如下情况 服务之间调用
假如说 我们现在有一个购物车接口访问路径是 /cart/search 那么我们微服务之间进行调用就可以 在调用方配置resttemplate 配置然后进行远程调用
具体代码实现如下
package com.hmall.cart.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;Configuration
public class RemoteCallConfig {Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
} private void handleCartItems(ListCartVO vos) {// TODO 1.获取商品idSetLong itemIds vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查询商品// ListItemDTO items itemService.queryItemByIds(itemIds);// 2.1.利用RestTemplate发起http请求得到http的响应ResponseEntityListItemDTO response restTemplate.exchange(http://localhost:8081/items?ids{ids},HttpMethod.GET,null,new ParameterizedTypeReferenceListItemDTO() {},Map.of(ids, CollUtil.join(itemIds, ,)));// 2.2.解析响应if(!response.getStatusCode().is2xxSuccessful()){// 查询失败直接结束return;}ListItemDTO items response.getBody();if (CollUtils.isEmpty(items)) {return;}// 3.转为 id 到 item的mapMapLong, ItemDTO itemMap items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.写入vofor (CartVO v : vos) {ItemDTO item itemMap.get(v.getItemId());if (item null) {continue;}v.setNewPrice(item.getPrice());v.setStatus(item.getStatus());v.setStock(item.getStock());}
}
但是你每次这样调用 都要写一遍这是不是显的太过冗余太过麻烦所以我们引用了接下来的组件 nacos
nacos
nacos是alibaba的一个组件具体的下载配置流程就不再赘述
下面我们进行一个场景的分析现在有一个购物车服务 cartservice 然后还有一个商品服务 itemservice我们是查看购物车的时候需要访问商品服务当我们的用户一多并发量上来的时候商品服务这个 模块有可能就会承受不住崩溃所以我们可以多开几个启动实例进行负载均衡的配置可是当我们访问的这几个不同的实例的时候我们该怎么访问这些实例呢
于是就有了nacos
nacos注册中心原理 当我们配置好nacos之后我们的实例的端口号 就会发送给nacos注册中心 当我们服务的调用者进行调用的时候具体的服务端口号就从nacos中进行拉取。但是当我们注册到几个实例到nacos中假如有一些实例变更了上传错误怎么办nacos会有一个心跳检测服务会定期像nacos中发送自己状态也就是心跳请求证明自己健康当nacos长时间收不到服务提供者的心跳的时候会认为该实例宕机从实例列表中剔除而服务列表变更nacos主动通知服务调用着更新本地服务列表 nacos使用
我们下载好nacos之后在数据库配置好nacos的对应数据表在nacos的custom.env文件中配置好自己ip地址然后访问http://xxxxxx:8848/nacos/ 这个xxx如果是虚拟机填虚拟机的ip如果是本机就填本机ip就可以。
然后就会有如下页面 然后我们在商品服务 itemservice中引入pom依赖
!--nacos 服务注册发现--
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId
/dependency
在商品服务的yml文件中配置
spring:application:name: item-service # 服务名称cloud:nacos:server-addr:xxxxx:8848 # nacos地址
xxxx为IP地址
然后我们拷贝多个实例 点击复制然后
配置好不同的端口启动实例就可以在nacos中看到服务上传的实例
服务发现
而我们想调用上传的服务也就是说购物车服务调用商品服务上传的实例
我们需要在购物车服务配置服务发现在购物车服务中yml文件中添加
spring:cloud:nacos:server-addr: xxx:8848
引入依赖 !--nacos 服务注册发现--
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId
/dependency
这个配置好也就是说购物车服务也会被注册为nacos服务既可以被调用也可以被调用 我们在service注册该bean 然后使用如下方法调用