引入OpenFeign
添加依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacosdiscovery</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
定義配置
server.port=6083
# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
spring.application.name=service-consumer
# Nacos 服務發現與注冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注冊到 nacos 的指定 namespace,默認為 public
spring.cloud.nacos.discovery.namespace=public
在主類或者配置類上添加注解以支持OpenClient應用
@EnableFeignClients // 激活 @FeignClient
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer3Application {public static void main(String[] args) {SpringApplication.run(Consumer3Application.class, args);}
}
定義http偽客戶端接口
@FeignClient("service-provider") // 指向服務提供者應用
public interface ProviderClient {@GetMapping("/users/hello")public String sayHello(@RequestParam("username") String username);
}
定義控制器,通過feign接口調用遠程的服務提供者
@RestController
@RequestMapping("/consumer")
public class ConsumerController {@Autowiredprivate ProviderClient providerClient;@GetMapping("/{name}")public String test(@PathVariable String name){String res = providerClient.sayHello(name);return res;}
}
測試
負載均衡策略配置
LB中提供了三種負載均衡策略,同時提供接口允許用戶自定義擴展
1、定義配置類
public class FeignClientConfiguration {@Beanpublic ReactorLoadBalancerreactorServiceInstanceLoadBalancer(ObjectProvider
serviceInstanceListSuppliers, Environment environment) {String name =
environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(serviceInstanceListSuppliers, name);}
}
2、可以全局或者局部配置使用設置的負載均衡策略
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer3Application {public static void main(String[] args) {SpringApplication.run(Consumer3Application.class, args);}
}
局部配置
@FeignClient(value="service-provider",configuration =
FeignClientConfiguration.class)
public interface ProviderClient {@GetMapping("/users/hello")public String sayHello(@RequestParam("username") String username);
}
失敗重試機制配置
如果通過使用OpenFeign訪問遠程的服務提供者,則可以配置由于網絡、連接、讀取等問題出現訪問失敗時,自動執行重試處理
1、首先定義配置
public class FeignClientConfiguration {@Beanpublic Retryer retryer(){return new Retryer.Default(100, 1000, 2);
//表示每間隔100ms,最大間隔1000ms重試一次,最大重試次數是1,因為第三個參數包含了
//第一次請求}
}
2、可以在注解中進行全局配置和局部配置
全局配置
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer3Application {public static void main(String[] args) {SpringApplication.run(Consumer3Application.class, args);}
}
局部配置
@FeignClient(value="service-provider",configuration =
FeignClientConfiguration.class)
public interface ProviderClient {@GetMapping("/users/hello")public String sayHello(@RequestParam("username") String username);
}
服務降級配置
在使用注冊中心時,OpenFeign作為服務間通信的組件,它本身集成了負載均衡能力、錯誤重試、日志、服務熔斷等機制,同時也能夠支持點對點的通信方式,讓開發者感覺更像是調用本地接口,而不是發起HTTP請求
具體的服務降級是依賴Sentinel組件實現的,所以需要添加Sentinel依賴
1、添加依賴
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、開啟服務熔斷配置application.properties
feign.circuitbreaker.enabled=true
3、定義對應的Fallback Factory實現
@Component
public class ProviderClientFallbackFactory implements
FallbackFactory<ProviderClient> {@Overridepublic ProviderClient create(Throwable cause) {return new ProviderClient() {@Overridepublic String sayHello(String username) {return cause.getMessage();}};}
}
4、配置使用Fallback降級處理
@FeignClient(value="service-provider",fallbackFactory =
ProviderClientFallbackFactory.class)
public interface ProviderClient {@GetMapping("/users/hello")public String sayHello(@RequestParam("username") String username);
}
查看日志信息
使用lombok提供的日志記錄器,自定義編程查看調試信息
1、引入lombok依賴
2、在application.properties中配置日志輸出等級
logging.level.com.yan=debug
3、在控制器中自定義輸出日志
@Slf4j
public class ConsumerController {@GetMapping("/{name}")public String test(@PathVariable String name){log.error("name:"+name);//輸出error等級的日志信息String res = providerClient.sayHello(name);return res;}
}
控制臺上查看日志信息輸出
查看Feign日志信息
1、添加配置類FeignClientConfiguration
public class FeignClientConfiguration {@Beanpublic Logger.Level feignLevel(){return Logger.Level.FULL;}
}
2、在FeignClient注解上引用該配置類
全局配置日志輸出等級
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer3Application {
在控制臺上可以輸出通過feign調用服務提供者的詳細信息
局部配置日志輸出等級
@FeignClient(value="service-provider",configuration =
FeignClientConfiguration.class)
public interface ProviderClient {@GetMapping("/users/hello")public String sayHello(@RequestParam("username") String username);
}
Nacos配置管理
將應用中的所有配置信息進行統一管理,同時當修改配置時會自動通知對應的微服務進行熱加載。Nacos在微服務集群中充當了配置管理中心的用途。需求例如有個配置 ma.date.format=yyyy-MM-dd
配置中心的思路是:
-
首先把項目中各種配置全部都放到一個集中的地方進行統一管理,并提供一套標準的接口。
-
當各個服務需要獲取配置的時候,就來配置中心的接口拉取自己的配置。
-
當配置中心中的各種參數有更新的時候,也能通知到各個服務實時的過來同步最新的信息,使之動態更新。
1、添加依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacosconfig</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.1.5</version>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacosdiscovery</artifactId>
</dependency>
2、新增一個配置文件bootstrap.properties或者yaml格式都可以
spring.cloud.nacos.config.server-addr=localhost:8848 服務配置中心的配置
spring.cloud.nacos.config.file-extension=properties 配置使用的后綴名,一般只使用properties和yaml兩種格式
spring.cloud.nacos.config.prefix=nacos-service #配置DataId名稱,默認就是服務名稱。
#可以人為指定在Nacos中創建的DataID值
spring.cloud.nacos.config.group=DEFAULT_GROUP #默認分組名稱
spring.cloud.nacos.config.namespace=public # 所使用的名空間
# 設置配置中心服務端地址
spring.cloud.nacos.config.server-addr=localhost:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,請不要填寫這個值,直接留空即可
spring.cloud.nacos.config.namespace=public
# 配置自動刷新 對應的格式為nacos:服務名稱.properties
spring.config.import=nacos:nacos-config-example.properties?refresh=true
3、核心配置文件application.properties
# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
spring.application.name=nacos-service
# Nacos 服務發現與注冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注冊到 nacos 的指定 namespace,默認為 public
spring.cloud.nacos.discovery.namespace=public
# 應用服務 WEB 訪問端口
server.port=8080
4、定義控制器類可以讀取配置信息 ma.date.format
@RefreshScope
@RestController
public class HelloController {@Value("${yan.date.format}") //SpELprivate String dateFormat;@GetMapping("/hello")public String hello(String name) {return new SimpleDateFormat(dateFormat).format(new Date()) +"said:'hello " + name + "!'";}
}
5、在Nacos的webUI中使用圖形化界面工具的方式創建一組配置
輸入對應的DataID并選擇對應的文件類型
一般規則【最佳軟件開發實踐】
-
命名空間Namespace:不同的項目可以分為不同的命名空間。
-
配置分組Group:根據項目的不同環境可以一個分組。
-
配置集Data ID:服務不同環境的不同配置,就是一個配置集
在webUI中可以查看所有的配置信息,并允許編輯修改
其它操作,例如查看曾經的歷史版本內容,并進行回退
查看歷史配置版本
查看監聽查詢