springcloud02---openFeign组件,key value传参、对象传参、Pathvariable传参、RequestBody传参、LoadBalancer组件、nacos动态参数配置_openfeign pathvariable
目录
springcloud
nacos组件
OpenFeign组件
实现远程服务调用
远程方法调用不同类型参数的测试
1、?key=value
2、对象传参
3、Pathvariable 传参
4、@RequestBody
示例代码:
提供者方:
声明接口:
消费者方:
LoadBalancer组件
Nacos配置中心
配置中心简介
配置中心好处
配置中心产品
低版本配置
高版本配置
操作步骤
Springcloud版本
springcloud
nacos组件
1、搭建nacos服务
2、注册微服务到nacos注册中心
3、实现微服务远程调用
搭建两个projectB,通过projectA远程调用。
restTemplate远程调用
@Bean@LoadBalancedpublic RestTemplate restTemplate(){ return new RestTemplate();}
@RestControllerpublic class HelloController { @Autowired private RestTemplate restTemplate; @RequestMapping(\"/getUser\") public User getUser(){// return restTemplate.getForObject(\"http://localhost:8081/user/info\", User.class); return restTemplate.getForObject(\"http://projectB/user/info\", User.class); }
org.springframework.cloud spring-cloud-starter-loadbalancer 3.1.8
默认负载均衡为轮询策略
OpenFeign组件
实现远程服务调用
实现负载均衡
在消费者方:
org.springframework.cloud spring-cloud-starter-loadbalancer 3.1.8 org.springframework.cloud spring-cloud-starter-openfeign 3.1.9
@SpringBootApplication@EnableDiscoveryClient@EnableFeignClients //启用FeignClient支持public class ProjectAApplication { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ProjectAApplication.class, args); }}
spring.main.allow-circular-references=true
声明远程调用的接口
目标类,目标方法:@RestController@RequestMapping(\"/user\")public class UserController { @RequestMapping(\"/info\") public User info(){ return new User(1,\"admin\"); }}//指定远程调用的服务名@FeignClient(value = \"projectB\")public interface UserFeign { //声明远程调用的接口 @RequestMapping(\"/user/info\") public User info();}
在当前服务中测试,远程调用:
@RequestMapping(\"/user\")@RestControllerpublic class UserController { @Autowired private UserFeign userFeign; @RequestMapping(\"/getInfo\") public User getInfo(){ return userFeign.info(); }}
远程方法调用不同类型参数的测试
1、?key=value
2、对象传参
3、Pathvariable 传参
4、@RequestBody
示例代码:
提供者方:
@RestController@RequestMapping(\"/user\")public class UserController { @RequestMapping(\"/info\") public User info(){ return new User(1,\"admin\"); } //restful风格 @RequestMapping(\"/info2/{id}/{name}\") public User info2(@PathVariable(value = \"id\") int id, @PathVariable(value = \"name\") String name){ return new User(id,name); } //?key=value传参 @RequestMapping(\"/info3\") public User info3(Integer id,String name){ return new User(id,name); } //?key=value传参 @RequestMapping(\"/info4\") public User info4(User user){ return user; } //json格式传递 @RequestMapping(\"/info5\") public User info5(@RequestBody User user){ return user; }}
声明接口:
package com.hl.api;import com.hl.entity.User;import feign.QueryMap;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.cloud.openfeign.SpringQueryMap;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;//指定远程调用的服务名@FeignClient(value = \"projectB\")public interface UserFeign { //声明远程调用的接口 @RequestMapping(\"/user/info\") public User info(); //restful风格 @RequestMapping(\"/user/info2/{id}/{name}\") public User info2(@PathVariable(value = \"id\") int id, @PathVariable(value = \"name\") String name); //?key=value传参 @RequestMapping(\"/user/info3\") public User info3(@RequestParam(\"id\") Integer id, @RequestParam(\"name\") String name); //?key=value传参 @RequestMapping(\"/user/info4\") public User info4(@SpringQueryMap User user); //json格式传递 @RequestMapping(\"/user/info5\") public User info5(@RequestBody User user);}
消费者方:
@RequestMapping(\"/user\")@RestControllerpublic class UserController { @Autowired private UserFeign userFeign; @RequestMapping(\"/getInfo\") public User getInfo(){ return userFeign.info(); } @RequestMapping(\"/restFul/{id}/{name}\") public User restFul(@PathVariable Integer id,@PathVariable String name){// return userFeign.info2(id,name);// return userFeign.info3(id,name); User user = new User(id,name); return userFeign.info4(user); } @RequestMapping(\"/json\") public User json(@RequestBody User user){ return userFeign.info5(user); }}
LoadBalancer组件
负载均衡方式
LoadBalancer默认提供了两种负载均衡策略:
-
RandomLoadBalancer - 随机分配策略
-
(默认) RoundRobinLoadBalancer - 轮询分配策略
Ribbon也是一样操作的。
在springcloud-consumer中
-
编写配置类
@Configurationpublic class CustomeLoadBalanceConfiguration { @Bean public ReactorLoadBalancer reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){ String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name); }}
-
修改配置类
@Configuration@LoadBalancerClient(value = \"loadbalancer-provider\",configuration = CustomeLoadBalanceConfiguration.class)public class RestTemplateConfiguration { @Bean @LoadBalanced //使用resttemplate方法时,进行客户端负载均衡操作 public RestTemplate restTemplate(){ return new RestTemplate(); }}
-
测试
重启springcloud-consumer,进行访问,发现会随机访问8082和8084端口的provider。
Nacos配置中心
配置中心简介
随着微服务架构的发展,企业级项目由无数的服务组成,这时候急需用到集中管理、治理的配置的组件,来统一管理各个服务的开关、配置参数、数据库地址、服务器等等,然而这还不够,还要对这个管理配置的组件有着修改后实时发布、多环境、灰度发布、权限控制、审核等等机制,由此配置中心出现了。
配置中心好处
-
集中管理配置文件
-
不同环境不同配置,动态化的配置更新
-
配置信息改变时,不需要重启即可更新配置信息到服务
配置中心产品
-
SpringCloud Config
-
Apollo
-
Nacos
低版本配置
Nacos支持动态的配置管理,将服务的配置信息分环境、分类别进行管理,并且支持热更新。Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心配置拉取,拉取配置后,才能保证项目的正常启动。不过与Config不同Nacos的配置信息存储于数据库中,支持配置信息的监听和版本回滚。
springboot中配置文件的加载是存在优先顺序的,bootstrap.yml(properties)优先级高于application.yml(properties)。
bootstrap.yml(bootstrap.properties)(springboot固定名称的配置文件) 用来程序引导时执行,应用于更加早期配置信息读取。
高版本配置
依然使用application.yml ,application.properties
导入nacos配置中心需要动态更新的配置文件。
操作步骤
1、nacos配置中心创建配置文件,添加动态参数
2、微服务上
添加jar包(nacos-config配置中心)
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config
配置文件指定相关参数(配置中心地址、用户名、密码,导入配置中心的动态配置文件)
#nacos配置中心spring.cloud.nacos.config.server-addr=localhost:8848spring.cloud.nacos.config.username=nacosspring.cloud.nacos.config.password=nacos#spring.cloud.nacos.config.context-path=/nacos# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可#spring.cloud.nacos.config.namespace=spring.config.import=nacos:projectA.yml?refresh=true
测试:
动态获取配置中心相关参数,修改配置中心,无需重启项目,看参数是否生效。
@Configuration@RefreshScope@RestControllerpublic class MyNacosConfig { @Value(\"${spring.data.username}\") private String username; @Value(\"${spring.data.password}\") private String password; @RequestMapping(\"/getLoginUser\") public LoginUser getLoginUser() { return new LoginUser(username,password); }}