十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問題一站解決
統(tǒng)一配置管理
配置獲取的步驟如下:
(bootstrap.yml文件是引導(dǎo)文件,優(yōu)先級(jí)高于application.yml)
將配置交給Nacos管理的步驟
①在Nacos中添加配置文件
在彈出的表單中填寫配置信息:
②在微服務(wù)中引入nacos的config依賴
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config
③在微服務(wù)中添加bootstrap.yml,配置nacos地址、當(dāng)前環(huán)境、服務(wù)名稱、文件后綴名。這些決定了程序啟動(dòng)時(shí)去nacos讀取哪個(gè)文件
spring:
application:
name: userservice # 服務(wù)名稱
profiles:
active: dev # 開發(fā)環(huán)境
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
config:
file-extension: yaml # 文件后綴名
在user-service中將pattern.dateformat這個(gè)屬性注入到UserController中做測(cè)試:
@RestController
@RequestMapping("/user")
public class UserController {
// 注入nacos中的配置屬性
@Value("${pattern.dateformat}")
private String dateformat;
// 編寫controller,通過日期格式化器來(lái)格式化現(xiàn)在時(shí)間并返回
@GetMapping("now")
public String now(){
return LocalDate.now().format(
DateTimeFormatter.ofPattern(dateformat, Locale.CHINA)
);
}
// ... 略
}
配置熱更新
Nacos中的配置文件變更后,微服務(wù)無(wú)需重啟就可以感知。不過需要通過下面兩種配置實(shí)現(xiàn):
方式一:在@Value注入的變量所在類上添加注解@RefreshScope
方式二:使用@ConfigurationProperties注解
注意事項(xiàng):
?不是所有的配置都適合放到配置中心,維護(hù)起來(lái)比較麻煩
?建議將一些關(guān)鍵參數(shù),需要運(yùn)行時(shí)調(diào)整的參數(shù)放到nacos配置中心,一般都是自定義配置
配置共享
微服務(wù)啟動(dòng)時(shí)會(huì)從nacos讀取多個(gè)配置文件:
①[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
②[spring.application.name].yaml,例如:userservice.yaml
無(wú)論profile如何變化,[spring.application.name].yaml這個(gè)文件一定會(huì)加載,因此多環(huán)境共享配置可以寫入這個(gè)文件
優(yōu)先級(jí):
[服務(wù)名]-[環(huán)境].yaml >[服務(wù)名].yaml >本地配置
搭建Nacos集群
集群搭建步驟:
①搭建MySQL集群并初始化數(shù)據(jù)庫(kù)表
②下載解壓nacos
③修改集群配置(節(jié)點(diǎn)信息)、數(shù)據(jù)庫(kù)配置
④分別啟動(dòng)多個(gè)nacos節(jié)點(diǎn)
⑤nginx反向代理
Feign替代RestTemplate
利用RestTemplate發(fā)起遠(yuǎn)程調(diào)用的代碼:
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
存在下面的問題:
代碼可讀性差,編程體驗(yàn)不統(tǒng)一
參數(shù)復(fù)雜URL難以維護(hù)
Feign是一個(gè)聲明式的http客戶端,其作用就是幫助我們優(yōu)雅的實(shí)現(xiàn)http請(qǐng)求的發(fā)送,解決上面提到的問題。
使用Feign的步驟如下:
引入依賴:
org.springframework.cloud spring-cloud-starter-openfeign
在order-service的啟動(dòng)類添加注解開啟Feign的功能(添加@EnableFeignClients注解):
編寫Feign客戶端
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
主要是基于SpringMVC的注解來(lái)聲明遠(yuǎn)程調(diào)用的信息,比如:
服務(wù)名稱:userservice
請(qǐng)求方式:GET
請(qǐng)求路徑:/user/{id}
請(qǐng)求參數(shù):Long id
返回值類型:User
用Feign客戶端代替RestTemplate
2. 自定義配置
配置Feign日志有兩種方式:
方式一:配置文件方式
①全局生效:
feign:
client:
config:
default: # 這里用default就是全局配置,如果是寫服務(wù)名稱,則是針對(duì)某個(gè)微服務(wù)的配置
loggerLevel: FULL
②局部生效:
feign:
client:
config:
userservice:
loggerLevel: FULL
方式二:java代碼方式,需要先聲明一個(gè)Bean:
public class FeignClientConfiguration {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC;
}
}
①如果是全局配置,則把它放到@EnableFeignClients這個(gè)注解中:
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
②如果是局部配置,則把它放到@FeignClient這個(gè)注解中:
@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)
3. Feign使用優(yōu)化
Feign底層的客戶端實(shí)現(xiàn):
URLConnection:默認(rèn)實(shí)現(xiàn),不支持連接池
Apache HttpClient :支持連接池
OKHttp:支持連接池
因此優(yōu)化Feign的性能主要包括:
①使用連接池代替默認(rèn)的URLConnection
②日志級(jí)別,最好用basic或none
性能優(yōu)化——連接池配置
①引入feign-httpclient依賴
io.github.openfeign feign-httpclient
②配置連接池(配置文件開啟httpClient功能,設(shè)置連接池參數(shù))
feign:
client:
config:
default:
loggerLevel: FULL
httpclient:
enabled: true # 支持HttpClient的開關(guān)
max-connections: 200 # 大連接數(shù)
max-connections-per-route: 50 # 單個(gè)路徑的大連接數(shù)
4. 最佳實(shí)踐
方式一(繼承):給消費(fèi)者的FeignClient和提供者的controller定義統(tǒng)一的父接口作為標(biāo)準(zhǔn)。
方式二(抽?。簩eignClient抽取為獨(dú)立模塊,并且把接口有關(guān)的POJO、默認(rèn)的Feign配置都放到這個(gè)模塊中,提供給所有消費(fèi)者使用
當(dāng)定義的FeignClient不在SpringBootApplication的掃描包范圍時(shí),這些FeignClient無(wú)法使用。有兩種方式解決:
方式一:指定FeignClient所在包
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
方式二:指定FeignClient字節(jié)碼
@EnableFeignClients(clients = {UserClient.class})
三、Gateway服務(wù)網(wǎng)關(guān)網(wǎng)關(guān)的作用
對(duì)用戶請(qǐng)求做身份認(rèn)證、權(quán)限校驗(yàn)
將用戶請(qǐng)求路由到微服務(wù),并實(shí)現(xiàn)負(fù)載均衡
對(duì)用戶請(qǐng)求做限流
gateway快速入門
搭建網(wǎng)關(guān)服務(wù)的步驟:
①創(chuàng)建新的module,引入SpringCloudGateway的依賴和nacos的服務(wù)發(fā)現(xiàn)依賴:
org.springframework.cloud spring-cloud-starter-gatewaycom.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
②編寫路由配置及nacos地址
server:
port: 10010 # 網(wǎng)關(guān)端口
spring:
application:
name: gateway # 服務(wù)名稱
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: # 網(wǎng)關(guān)路由配置
- id: user-service # 路由標(biāo)示,必須唯一
# uri: http://127.0.0.1:8081 # 路由的目標(biāo)地址 http就是固定地址
uri: lb://userservice # 路由的目標(biāo)地址 lb就是負(fù)載均衡,后面跟服務(wù)名稱
predicates:
- Path=/user/** # 路徑斷言 判斷路徑是否是以/user開頭,如果是則符合
網(wǎng)關(guān)搭建步驟:
1.創(chuàng)建項(xiàng)目,引入nacos服務(wù)發(fā)現(xiàn)和gateway依賴
2.配置application.yml,包括服務(wù)基本信息、nacos地址、路由
路由配置包括:
1.路由id:路由的唯一標(biāo)示
2.路由目標(biāo)(uri):路由的目標(biāo)地址,http代表固定地址,lb代表根據(jù)服務(wù)名負(fù)載均衡
3.路由斷言(predicates):路由斷言,判斷請(qǐng)求是否符合要求,符合則轉(zhuǎn)發(fā)到路由目的地
4.路由過濾器(filters):對(duì)請(qǐng)求或響應(yīng)做處理
斷言工廠
PredicateFactory讀取用戶定義的斷言條件,對(duì)請(qǐng)求做出判斷
過濾器工廠
過濾器的作用:
①對(duì)路由的請(qǐng)求或響應(yīng)做加工處理,比如添加請(qǐng)求頭
②配置在路由下的過濾器只對(duì)當(dāng)前路由的請(qǐng)求生效
案例:給所有進(jìn)入userservice的請(qǐng)求添加一個(gè)請(qǐng)求頭:Truth=itcast is freaking awesome!
實(shí)現(xiàn)方式:在gateway中修改application.yml文件,給userservice的路由添加過濾器:
spring:
cloud:
gateway:
routes:
- id: user-service # 路由標(biāo)示,必須唯一
uri: lb://userservice # 路由的目標(biāo)地址
predicates:
- Path=/user/** # 路徑斷言 判斷路徑是否是以/user開頭,如果是則符合
filters:
- AddRequestHeader=Truth,Itcast is freaking aowsome!
如果要對(duì)所有的路由都生效,則可以將過濾器工廠寫到default下,格式如下:
defaultFilters的作用是對(duì)所有路由都生效的過濾器
spring:
application:
name: gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
routes:
- id: user-service # 路由標(biāo)示,必須唯一
uri: lb://userservice # 路由的目標(biāo)地址
predicates:
- Path=/user/** # 路徑斷言 判斷路徑是否是以/user開頭,如果是則符合
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
default-filters:
- AddRequestHeader=Truth,Itcast is freaking aowsome!
全局過濾器
全局過濾器的作用也是處理一切進(jìn)入網(wǎng)關(guān)的請(qǐng)求和微服務(wù)響應(yīng),與GatewayFilter的作用一樣。
區(qū)別在于GatewayFilter通過配置定義,處理邏輯是固定的。而GlobalFilter的邏輯需要自己寫代碼實(shí)現(xiàn),定義方式是實(shí)現(xiàn)GlobalFilter接口。
實(shí)現(xiàn)全局過濾器的步驟:
①實(shí)現(xiàn)GlobalFilter接口
②添加@Order注解或?qū)崿F(xiàn)Ordered接口
③編寫處理邏輯
案例:定義全局過濾器,攔截請(qǐng)求,判斷請(qǐng)求的參數(shù)是否滿足下面條件:
?參數(shù)中是否有authorization,
?authorization參數(shù)值是否為admin
如果同時(shí)滿足則放行,否則攔截
@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
@Override
public Monofilter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1.獲取請(qǐng)求參數(shù)
ServerHttpRequest request = exchange.getRequest();
MultiValueMapparams = request.getQueryParams();
//2.獲取參數(shù)中的authorization參數(shù)
String auth = params.getFirst("authorization");
//3.判斷參數(shù)值是否等于admin
if("admin".equals(auth)){
//4.是,放行
return chain.filter(exchange);
}
//5.否,攔截
//5.1.設(shè)置狀態(tài)碼
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//5.2.攔截請(qǐng)求
return exchange.getResponse().setComplete();
}
}
路由過濾器、defaultFilter、全局過濾器的執(zhí)行順序
①order值越小,優(yōu)先級(jí)越高
②當(dāng)order值一樣時(shí),順序是defaultFilter最先,然后是局部的路由過濾器,最后是全局過濾器
跨域問題
跨域:域名不一致就是跨域,主要包括:
域名不同:www.taobao.com 和 www.taobao.org和 www.jd.com 和 miaosha.jd.com
域名相同,端口不同:localhost:8080和localhost8081
跨域問題:瀏覽器禁止請(qǐng)求的發(fā)起者與服務(wù)端發(fā)生跨域ajax請(qǐng)求,請(qǐng)求被瀏覽器攔截的問題
解決方案:CORS
網(wǎng)關(guān)處理跨域采用的同樣是CORS方案,并且只需要簡(jiǎn)單配置即可實(shí)現(xiàn):
spring:
cloud:
gateway:
# 。。。
globalcors: # 全局的跨域處理
add-to-simple-url-handler-mapping: true # 解決options請(qǐng)求被攔截問題
corsConfigurations:
'[/**]':
allowedOrigins: # 允許哪些網(wǎng)站的跨域請(qǐng)求
- "http://localhost:8090"
- "http://www.leyou.com"
allowedMethods: # 允許的跨域ajax的請(qǐng)求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允許在請(qǐng)求中攜帶的頭信息
allowCredentials: true # 是否允許攜帶cookie
maxAge: 360000 # 這次跨域檢測(cè)的有效期
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧