Просмотр исходного кода

feat:使用OpenFeign进行远程调用,代替RestTemplate

yang yi 1 год назад
Родитель
Сommit
8ffadd0918

+ 4 - 0
member-service-consumer/pom.xml

@@ -35,6 +35,10 @@
             <artifactId>lombok</artifactId>
             <optional>true</optional>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 2 - 0
member-service-consumer/src/main/java/anyi/space/memberConsumer/MemberConsumerApplication.java

@@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 
 /**
  * @ProjectName: distributedSystemLearn
@@ -13,6 +14,7 @@ import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  * @Data:2025/4/13 20:05
  * @Description:
  */
+@EnableFeignClients
 @EnableDiscoveryClient
 @EnableEurekaClient
 @SpringBootApplication(exclude= DataSourceAutoConfiguration.class)

+ 0 - 22
member-service-consumer/src/main/java/anyi/space/memberConsumer/config/RestTemplateConfig.java

@@ -1,22 +0,0 @@
-package anyi.space.memberConsumer.config;
-
-import org.springframework.cloud.client.loadbalancer.LoadBalanced;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.client.RestTemplate;
-
-/**
- * @ProjectName: distributedSystemLearn
- * @FileName: RestTemplateConfig
- * @Author: 杨逸
- * @Data:2025/4/13 20:06
- * @Description:
- */
-@Configuration
-public class RestTemplateConfig {
-    @Bean
-    @LoadBalanced
-    public RestTemplate getRestTemplate(){
-        return new RestTemplate();
-    }
-}

+ 2 - 4
member-service-consumer/src/main/java/anyi/space/memberConsumer/controller/MemberConsumerController.java

@@ -35,15 +35,13 @@ public class MemberConsumerController {
     private final ObjectMapper objectMapper;
     @GetMapping
     public ResponseResult<Member> getMemberById(Long id){
-        Member member = memberService.getById(id);
-        return ResponseResult.okResult(member);
+        return memberService.getById(id);
     }
     @PostMapping
     public ResponseResult addMember(Member member){
         String hex = DigestUtils.md5DigestAsHex(member.getPwd().getBytes(StandardCharsets.UTF_8));
         member.setPwd(hex);
-        boolean save = memberService.save(member);
-        return ResponseResult.okResult(save);
+        return  memberService.save(member);
     }
     @GetMapping("/discovery")
     public ResponseResult discovery(){

+ 26 - 2
member-service-consumer/src/main/java/anyi/space/memberConsumer/service/MemberService.java

@@ -1,6 +1,13 @@
 package anyi.space.memberConsumer.service;
 
 import anyi.sapce.common.entity.Member;
+import anyi.sapce.common.entity.ResponseResult;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
 /**
  * @ProjectName: distributedSystemLearn
@@ -9,8 +16,25 @@ import anyi.sapce.common.entity.Member;
  * @Data:2025/4/13 20:10
  * @Description:
  */
+//注入到IOC容器中
+@Component
+//声明这是一个Feign客户端,value的值为服务提供方注册到服务注册中心的名称
+@FeignClient(value = "member-service-provider")
 public interface MemberService {
-    Member getById(Long id);
+    /**
+     * 根据id查询会员信息
+     * @param id
+     * @return 会员信息
+     * 使用SpringMVC的注解来声明远程调用接口和接口的参数
+     */
+    @GetMapping("/member-provider/member")
+    ResponseResult<Member> getById(@RequestParam("id") Long id);
 
-    boolean save(Member member);
+    /**
+     * 新增会员信息
+     * @param member
+     * @return 成功ture,失败false
+     */
+    @PostMapping("/member-provider/member")
+    ResponseResult<Boolean> save(@RequestBody Member member);
 }

+ 0 - 63
member-service-consumer/src/main/java/anyi/space/memberConsumer/service/impl/MemberServiceIml.java

@@ -1,63 +0,0 @@
-package anyi.space.memberConsumer.service.impl;
-
-import anyi.sapce.common.entity.Member;
-import anyi.sapce.common.entity.ResponseResult;
-import anyi.space.memberConsumer.service.MemberService;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Service;
-import org.springframework.web.client.RestTemplate;
-
-import java.util.Map;
-
-/**
- * @ProjectName: distributedSystemLearn
- * @FileName: MemberServiceIml
- * @Author: 杨逸
- * @Data:2025/4/13 20:10
- * @Description:
- */
-@Slf4j
-@RequiredArgsConstructor
-@Service
-public class MemberServiceIml implements MemberService {
-    private final RestTemplate restTemplate;
-    private final ObjectMapper objectMapper;
-    private final static String MEMBER_SERVICE_URL = "http://member-service-provider";
-    @Override
-    public Member getById(Long id) {
-        /**
-         * 通过RestTemplate调用远程服务
-         */
-        ResponseEntity<ResponseResult> resultResponseEntity = restTemplate.getForEntity(MEMBER_SERVICE_URL + "/member-provider/member?id="+id, ResponseResult.class);
-        try {
-            log.info("远程调用服务返回结果:{}",objectMapper.writeValueAsString(resultResponseEntity.getBody()));
-        } catch (JsonProcessingException e) {
-            e.printStackTrace();
-        }
-        Object data = resultResponseEntity.getBody().getData();
-        //映射请求结果
-        Map map = (Map) data;
-        Member member = new Member();
-        id = Long.valueOf(map.get("id") + "");
-        member.setId(id);
-        member.setName((String) map.get("name"));
-        member.setPwd((String) map.get("pwd"));
-        member.setEmail((String) map.get("email"));
-        member.setGender((int)map.get("gender"));
-        return member;
-    }
-
-    @Override
-    public boolean save(Member member) {
-        //直接传递参数,是使用json的格式提交数据
-        ResponseEntity<ResponseResult> responseResultResponseEntity = restTemplate.postForEntity(MEMBER_SERVICE_URL + "/member-provider/member", member, ResponseResult.class);
-        //HttpEntity<String> stringHttpEntity = new HttpEntity<>();
-        Object data = responseResultResponseEntity.getBody().getData();
-        boolean flag = (boolean) data;
-        return flag;
-    }
-}