瀏覽代碼

0731 openfeign多重用法

Qing 9 月之前
父節點
當前提交
a43b3fe6a2

+ 2 - 2
springcloud-demo/nacos-demo/src/main/resources/application.yml

@@ -4,8 +4,8 @@ spring:
       # 配置nacos的注册中心
       discovery:
         server-addr: 127.0.0.1:8848
-#        username: nacos
-#        password: nacos
+        username: nacos
+        password: nacos
 
 server:
   port: 18080

+ 2 - 2
springcloud-demo/nacos-demo/src/main/resources/bootstrap-dev.yml

@@ -16,5 +16,5 @@ spring:
             refresh: true
           - data-id: jdbc.properties
             refresh: true
-#        username: nacos
-#        password: nacos
+        username: nacos
+        password: nacos

+ 2 - 2
springcloud-demo/nacos-demo/src/main/resources/bootstrap.yml

@@ -16,5 +16,5 @@ spring:
             refresh: true
           - data-id: jdbc.properties
             refresh: true
-#        username: nacos
-#        password: nacos
+        username: nacos
+        password: nacos

+ 14 - 0
springcloud-demo/service-consumer-demo/src/main/java/com/sf/config/FeignInterceptor.java

@@ -0,0 +1,14 @@
+package com.sf.config;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import org.springframework.context.annotation.Configuration;
+
+// feign的拦截器 会使得所有通过feign发送的请求 都携带设置的header信息
+//@Configuration
+public class FeignInterceptor implements RequestInterceptor {
+    @Override
+    public void apply(RequestTemplate requestTemplate) {
+        requestTemplate.header("token", "654321");
+    }
+}

+ 0 - 11
springcloud-demo/service-consumer-demo/src/main/java/com/sf/config/LoadBalancerConfig.java

@@ -25,15 +25,4 @@ public class LoadBalancerConfig {
                 loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
     }
 
-//
-//    @Bean
-//    public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
-//            ConfigurableApplicationContext context) {
-//        return ServiceInstanceListSupplier.builder()
-//                .withDiscoveryClient()
-//                .withWeighted()
-//                .withCaching()
-//                .build(context);
-//    }
-
 }

+ 26 - 0
springcloud-demo/service-consumer-demo/src/main/java/com/sf/config/NacosLoadBalancerConfig.java

@@ -0,0 +1,26 @@
+package com.sf.config;
+
+import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+import com.alibaba.cloud.nacos.loadbalancer.NacosLoadBalancer;
+import jakarta.annotation.Resource;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
+import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
+import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
+import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.core.env.Environment;
+
+//@LoadBalancerClients(defaultConfiguration = NacosLoadBalancerConfig.class)
+public class NacosLoadBalancerConfig {
+    @Resource
+    private NacosDiscoveryProperties nacosDiscoveryProperties;
+
+    @Bean
+    public ReactorLoadBalancer<ServiceInstance> nacosLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
+        String name = environment.getProperty("loadbalancer.client.name");
+        return new NacosLoadBalancer(
+                loadBalancerClientFactory.getLazyProvider(name,
+                        ServiceInstanceListSupplier.class), name, nacosDiscoveryProperties);
+    }
+}

+ 35 - 5
springcloud-demo/service-consumer-demo/src/main/java/com/sf/controller/OpenFeignController.java

@@ -3,10 +3,11 @@ package com.sf.controller;
 import com.sf.dto.UserDto;
 import com.sf.remote.MyProviderClient;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
 
 @RestController
 public class OpenFeignController {
@@ -45,7 +46,36 @@ public class OpenFeignController {
     public String testMultiParam(UserDto userDto) {
         System.out.println("testMultiParam:" + userDto);
 //        String result = myProviderClient.testMultiParam(userDto);
-        String result = myProviderClient.testMultiParam(userDto.getName(), userDto.getAge());
+        // 使用拆解类的方式 传输参数
+//        String result = myProviderClient.testMultiParam(userDto.getName(), userDto.getAge());
+
+        // 使用参数类型为map的方法进行调用
+        Map<String, Object> map = new HashMap<>();
+        map.put("name", userDto.getName());
+        map.put("age", userDto.getAge());
+        String result = myProviderClient.testMultiParam(map);
+        return "result:" + result;
+    }
+
+    // POST http://localhost:8080/openfeign/postUser
+    // {
+    //  "name": "zhangsan",
+    //  "age": 90
+    // }
+    @PostMapping("/openfeign/postUser")
+    public String postUser(@RequestBody UserDto user) {
+        System.out.println("postUser:" + user);
+        String result = myProviderClient.postUser(user);
+        return "result:" + result;
+    }
+
+    // http://localhost:8080/openfeign/token
+    @GetMapping("/openfeign/token")
+    public String token(@RequestHeader("token") String token) {
+        System.out.println("token:" + token);
+//        String result = myProviderClient.token();
+        String result = myProviderClient.token(token);
+//        String result = myProviderClient.tokenByInterceptor();
         return "result:" + result;
     }
 }

+ 25 - 3
springcloud-demo/service-consumer-demo/src/main/java/com/sf/remote/MyProviderClient.java

@@ -2,11 +2,14 @@ package com.sf.remote;
 
 import com.sf.dto.UserDto;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
 
 // 使用注解@FeignClient 来声明接口对应的服务名
+
+//@LoadBalancerClient(name = "service-provider-demo",
+//        configuration = NacosLoadBalancerConfig.class)
 @FeignClient("service-provider-demo")
 public interface MyProviderClient {
 
@@ -35,4 +38,23 @@ public interface MyProviderClient {
     @GetMapping("/testMultiParam")
     String testMultiParam(@RequestParam("name") String name, @RequestParam("age") Integer age);
 
+    // 第二种解决方案是
+    @GetMapping("/testMultiParam")
+    String testMultiParam(@RequestParam Map<String,Object> map);
+
+    @PostMapping("/postUser")
+    String postUser(@RequestBody UserDto user);
+
+    // 通过openFeign调用其他微服务时 怎么携带请求头
+    // 第一种 直接写在方法的注解中
+    @GetMapping(value = "/token",headers = {"token=123456"})
+    String token();
+
+    // 第二种  方法入参中使用@RequestHeader
+    @GetMapping("/token")
+    String token(@RequestHeader("token") String token);
+
+    // 第三种 使用Feign拦截器
+    @GetMapping("/token")
+    String tokenByInterceptor();
 }

+ 7 - 0
springcloud-demo/service-consumer-demo/src/main/resources/application.yml

@@ -6,5 +6,12 @@ spring:
       # 配置nacos的注册中心
       discovery:
         server-addr: 127.0.0.1:8848
+        username: nacos
+        password: nacos
+    loadbalancer:
+      # 打开nacos提供的负载均衡
+      nacos:
+        enabled: true
+
 server:
   port: 8080

+ 16 - 0
springcloud-demo/service-provider-demo/src/main/java/com/sf/controller/HeaderController.java

@@ -0,0 +1,16 @@
+package com.sf.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class HeaderController {
+
+    // http://localhost:8070/token
+    @GetMapping("/token")
+    public String token(@RequestHeader("token") String token) {
+        System.out.println("token:" + token);
+        return "success";
+    }
+}

+ 17 - 0
springcloud-demo/service-provider-demo/src/main/java/com/sf/controller/PostController.java

@@ -0,0 +1,17 @@
+package com.sf.controller;
+
+import com.sf.dto.UserDto;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class PostController {
+
+    // http://localhost:8070/postUser
+    @PostMapping("/postUser")
+    public String postUser(@RequestBody UserDto user) {
+        System.out.println("postUser:" + user);
+        return "postUser success";
+    }
+}

+ 5 - 2
springcloud-demo/service-provider-demo/src/main/resources/application-dev.yml

@@ -6,7 +6,10 @@ spring:
       # 配置nacos的注册中心
       discovery:
         server-addr: 127.0.0.1:8848
-    loadbalancer:
-      configurations: 10
+        username: nacos
+        password: nacos
+        weight: 2
+#    loadbalancer:
+#      configurations: 10
 server:
   port: 8071

+ 6 - 2
springcloud-demo/service-provider-demo/src/main/resources/application.yml

@@ -6,8 +6,12 @@ spring:
       # 配置nacos的注册中心
       discovery:
         server-addr: 127.0.0.1:8848
-    loadbalancer:
-      configurations: 5
+        username: nacos
+        password: nacos
+        # 设置实例的权重
+        weight: 10
+#    loadbalancer:
+#      configurations: 5
 #      spring.cloud.loadbalancer.configurations
 server:
   port: 8070