天津做网站报价装修公司找哪家比较好
2026/1/11 8:35:38 网站建设 项目流程
天津做网站报价,装修公司找哪家比较好,校园二手交易网站开发,wordpress主题xiu5.6最近主包的考试有点多#xff0c;六级#xff0c;期末#xff0c;所以最近有点偷懒 废话不多说#xff0c;回归正题 服务注册和发现 首先我们需要先去知道为什么要进行服务注册和发现#xff0c;因为我们在使用微服务的时候每个项目都是独立的对不对#xff0c;那么我要是…最近主包的考试有点多六级期末所以最近有点偷懒废话不多说回归正题服务注册和发现首先我们需要先去知道为什么要进行服务注册和发现因为我们在使用微服务的时候每个项目都是独立的对不对那么我要是比如去购买东西的话是不是我的用户信息需要去共享这样的话我创建订单就能知道是谁购买的对不对nacos这里改成自己的虚拟机的ip地址然后需要去映射nacosdocker run-d \--name nacos \--env-file./nacos/custom.env \-p 8848:8848 \-p 9848:9848 \-p 9849:9849 \--restartalways \ nacos/nacos-server:v2.1.0-slim这样就能映射到8848端口了但是要是想要去使用的话我们还需要再nacos当中去注册一下!--nacos 服务注册发现-- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency这样的话我们在启动的时候就能扫描到了spring: application: name: item-service# 服务名称cloud: nacos: server-addr:自己虚拟机的ip地址:8848# nacos地址这里需要配置一下nacos的地址最后配置出来是这个样子的这样就能被nacos扫描到但是话又说回来了我只有服务注册的话还是不够啊我光注册有啥用我最终肯定是需要去调用的对不对那我去调用的话就需要使用服务发现了!--nacos 服务注册发现-- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency可以发现这里Nacos的依赖于服务注册时一致这个依赖中同时包含了服务注册和发现的功能。因为任何一个微服务都可以调用别人也可以被别人调用即可以是调用者也可以是提供者。openfeign现在我们需要去使用远程服务的话就需要使用openfeign来进行调用方法首先还是需要去引入依赖!--openFeign-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-openfeign/artifactId /dependency !--负载均衡器-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-loadbalancer/artifactId /dependency这里使用的openfeign和负载均衡的依赖在配置完成依赖之后还需要在启动类上面加上enablefeignclients的注解里面的value指的是需要扫描到的包在后面我们会重新解释一下的接下来就需要去编写client的客户端来进行调用这里需要先去声明一下关于feignclient的客户端扫描的模块是哪个后面的配置注解也是在后面会讲到的在这里大家需要注意到的是这里使用的是代理的方式来进行唤醒方法然后去转发请求但是这里面的路径我们需要写全注意是写全就是locakhost后面的都需要写上去不然会出现找不到的异常写完这个时候我们打底的就完成了剩下的就是去调用这个方法这里就是去调用的方法接下来就是去开启连接池!--OK http 的依赖-- dependency groupIdio.github.openfeign/groupId artifactIdfeign-okhttp/artifactId /dependencyfeign: okhttp: enabled: true# 开启OKHttp功能这里需要先去引入okhttp的依赖然后再去配置文件里面去开启okhttp的功能最后就是去配置日志OpenFeign只会在FeignClient所在包的日志级别为DEBUG时才会输出日志。而且其日志级别有4级NONE不记录任何日志信息这是默认值。BASIC仅记录请求的方法URL以及响应状态码和执行时间HEADERS在BASIC的基础上额外记录了请求和响应的头信息FULL记录所有请求和响应的明细包括头信息、请求体、元数据。Feign默认的日志级别就是NONE所以默认我们看不到请求日志。首先这里面需要去配置一下日志这里我们将日志等级设置成全部记录这里还需要回顾一下前面的知识我们在配置日志的时候默认这里配置的是全局变量然后要是需要配置的是局部变量的话需要在client上面去配置这里指定的就是我需要关联的是哪个模块然后给这个模块配置一下网关首先大家需要知道我为什么需要去设置网关网关就相当于是大门我们去创建订单的时候还是需要去获取用户的id但是这个用户的id我是从哪里获取这是个问题所以我需要网关来去拦截要是没有人的话我就需要拦截请求什么是网关顾明思议网关就是网络的关口。数据在网络间传输从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。更通俗的来讲网关就像是以前园区传达室的大爷。外面的人要想进入园区必须经过大爷的认可如果你是不怀好意的人肯定被直接拦截。外面的人要传话或送信要找大爷。大爷帮你带给目标人。现在微服务网关就起到同样的作用。前端请求不能直接访问微服务而是要请求网关网关可以做安全控制也就是登录身份校验校验通过才放行通过认证后网关再根据请求判断应该访问哪个微服务将请求转发过去这里我们去创建网关的模块?xml version1.0encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd parent artifactIdhmall/artifactId groupIdcom.heima/groupId version1.0.0/version /parent modelVersion4.0.0/modelVersion artifactIdhm-gateway/artifactId properties maven.compiler.source11/maven.compiler.source maven.compiler.target11/maven.compiler.target /properties dependencies !--common-- dependency groupIdcom.heima/groupId artifactIdhm-common/artifactId version1.0.0/version /dependency !--网关-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-gateway/artifactId /dependency !--nacos discovery-- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency !--负载均衡-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-loadbalancer/artifactId /dependency /dependencies build finalName${project.artifactId}/finalName plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project然后去配置路由server: port: 8080 spring: application: name: gateway cloud: nacos: server-addr: 192.168.150.101:8848 gateway: routes:-id: item# 路由规则id自定义唯一uri: lb://item-service# 路由的目标服务lb代表负载均衡会从注册中心拉取服务列表predicates:# 路由断言判断当前请求是否符合当前规则符合则路由到目标服务-Path/items/**,/search/**# 这里是以请求路径作为判断规则-id: cart uri: lb://cart-service predicates:-Path/carts/**-id: user uri: lb://user-service predicates:-Path/users/**,/addresses/**-id: trade uri: lb://trade-service predicates:-Path/orders/**-id: pay uri: lb://pay-service predicates:-Path/pay-orders/**这里给大家透个底后面会优化的网关过滤器这里定义网关过滤器就是为了去拦截请求不然的话要网关的意义是就没有了最后是nettyroutingFilter来发送的请求所以我的网关要是需要过滤的话是不是就需要正在这个请求之前所以这里取使用的是globalfilter来进行拦截前端不是发送的请求吗携带的请求头里面是不是我的jwt来进行加密的吗所以这里我就需要使用jwt来进行解析出来用户的id要是存在用户的id的话我是不是就直接放行要是不存在的话我就直接返回给前端一个404的错误但是这时候我的最初目的是什么我是不是需要将用户的id传递下去所以这里我是不是需要将id传递这时候就需要使用ServerWebExchange build exchange.mutate().request(a- a.header(user-info,userInfo)).build();我调用mutate将请求写到里面去这样的话用户id就会随着网关进行转发转发到每个子模块当中但是这时候又存在问题了我现在是给子模块了但是子模块怎么进行获取呢所以下载乃我需要去定义一个全局的拦截器去将用户id拿出来然后存起来所以这时候就需要使用common下面的模块了package com.hmall.common.interceptor;import com.ctc.wstx.util.StringUtil;import com.hmall.common.utils.UserContext;import org.springframework.util.StringUtils;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;publicclassuserInfoInterceptor implements org.springframework.web.servlet.HandlerInterceptor{Override public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throws Exception{String header request.getHeader(user-info);if(!StringUtils.isEmpty(header)){Long userId Long.valueOf(header);UserContext.setUser(userId);}returntrue;}Override public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex)throws Exception{UserContext.removeUser();}然后去添加拦截器package com.hmall.common.config;import com.hmall.common.interceptor.userInfoInterceptor;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Conditional;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;Configuration ConditionalOnClass(name org.springframework.web.servlet.DispatcherServlet)publicclassmvcConfig implements org.springframework.web.servlet.config.annotation.WebMvcConfigurer{Override public void addInterceptors(InterceptorRegistry registry){registry.addInterceptor(new userInfoInterceptor()).excludePathPatterns(/users/login).excludePathPatterns(/search/**).excludePathPatterns(/items/**);}}这里面需要去除我在网关里面的因为我在网关里面引用了common模块common模块是mvc的但是我的网关是webflux的没有mvc的配置所以你要是不想让这个拦截器在网关里面生效的话需要将这个排除在外同时因为是定义在common模块下面的没法被其他的微服务扫描到所以这里需要去自动装配org.springframework.boot.autoconfigure.EnableAutoConfiguration\ com.hmall.common.config.MyBatisConfig,\ com.hmall.common.config.MvcConfig我去解析请求头这样的话我的用户id就能在每个子模块之间传递对不对现在我们的网关到微服务之间的用户的信息是不是已经完成了但是问题又来了我要是用户信息在微服务之间进行传递的话我还是会报错所以我们需要将用户的信息随着我去向另一个微服务发送请求的时候是不是就需要一块传递过去所以这时候我们就用到了openfeign的拦截器Bean public RequestInterceptor userInfoRequestInterceptor(){returnnew RequestInterceptor(){Override public void apply(RequestTemplate template){//获取登录用户 Long userId UserContext.getUser();if(userId null){//如果为空则直接跳过return;}//如果不为空则放入请求头中传递给下游微服务 template.header(user-info,userId.toString());}};}这里直接去创建一个拦截器然后将用户的信息存放到请求头里面传递给下游微服务这样的话又会被common拦截到这样又能存到usercontext里面去这样的话我的用户信息就能在微服务之间进行传递了配置管理这里我们要是需要在线上微调的话我的配置还是需要变动但是我又不想直接在服务里面写死这样我每次调试都需要重启服务所以我们来介绍一下配置首先来讲一下配置共享就是去里面创建这里面的配置项不要写的太死了这里面就相当于是我又卸载resources下面的直接把这个当成yaml文件就行然后就是去拉去配置!--nacos配置管理-- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependency !--读取bootstrap文件-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-bootstrap/artifactId /dependency还是需要先去引入依赖然后去创建bootstrap的yaml文件接下来就是热部署package com.hmall.cart.config;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;DataComponent ConfigurationProperties(prefix hm.cart)publicclassCartProperties{private Integer maxAmount;}其实和yaml一样定义在nacos里面就行这样我们在去修改的时候就能直接修改nacos里面的文件实现热部署就不需要重新启动服务了最后就是动态路由!--统一配置管理-- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependency !--加载bootstrap-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-bootstrap/artifactId /dependency首先还是先去引入依赖spring: application: name: gateway cloud: nacos: server-addr: 192.168.150.101 config: file-extension: yaml shared-configs:-dataId: shared-log.yaml# 共享日志配置然后去引入共享配置最后就是去动态更新路由package com.heima.gateway;import ch.qos.logback.classic.spi.EventArgUtil;import cn.hutool.core.collection.CollectionUtil;import cn.hutool.json.JSONUtil;import com.alibaba.cloud.nacos.NacosConfigManager;import com.alibaba.nacos.api.config.listener.Listener;import com.alibaba.nacos.api.exception.NacosException;import com.heima.config.AuthProperties;import com.heima.config.gatewayConfig;import lombok.Data;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.cloud.gateway.route.RouteDefinition;import org.springframework.cloud.gateway.route.RouteDefinitionWriter;import org.springframework.stereotype.Component;import reactor.core.publisher.Mono;import javax.annotation.PostConstruct;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Executor;Slf4j DataComponent RequiredArgsConstructor publicclassDynamicRoureLoader{private final NacosConfigManager nacosConfigManager;private final RouteDefinitionWriter routeDefinitionWriter;private final gatewayConfig GatewayConfig;private final List String routeIds new ArrayList();PostConstruct public void init()throws NacosException{//获取nacos中的配置 String configInfo nacosConfigManager.getConfigService().getConfigAndSignListener(GatewayConfig.getDataId(),GatewayConfig.getGroup(),5000,new Listener(){Override public Executor getExecutor(){returnnull;}Override public void receiveConfigInfo(String configInfo){updateRouteDefinition(configInfo);}});updateRouteDefinition(configInfo);}private void updateRouteDefinition(String configInfo){log.debug(监听到路由配置变更{},configInfo);//1.删除之前存在过的路由信息 routeIds.forEach(id- routeDefinitionWriter.delete(Mono.just(id)).subscribe());routeIds.clear();//2.添加新的路由信息 ListRouteDefinition list JSONUtil.toList(configInfo,RouteDefinition.class);//3.判断是不是需要添加新的路由信息if(CollectionUtil.isEmpty(list)){return;}for(RouteDefinition routeDefinition : list){routeDefinitionWriter.save(Mono.just(routeDefinition)).subscribe();routeIds.add(routeDefinition.getId());}}}这里我们需要注入的是nacosconfig和routeDefinitionWriter至于gateway那是我自己定义的一个大家不需要在意然后就是在类加载完毕的时候去初始化路由增加监听器更新路由配置恒心路由配置的时候需要注意的是我们要去订阅因为mono是懒惰式的需要调用才能执行

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询