瀏覽代碼

feat:通过SpringCloudGateway网关组件访问服务提供方,通过application.yaml配置文件配置路由规则

yang yi 1 年之前
父節點
當前提交
50f626ef92

+ 3 - 7
member-service-consumer/pom.xml

@@ -21,14 +21,10 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
         </dependency>
+        <!--引入gateway依赖-->
         <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>anyi.space</groupId>
-            <artifactId>common</artifactId>
-            <version>${project.version}</version>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-gateway</artifactId>
         </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>

+ 3 - 6
member-service-consumer/src/main/java/anyi/space/memberConsumer/MemberConsumerApplication.java → member-service-consumer/src/main/java/anyi/space/memberConsumer/MemberGatewayApplication.java

@@ -2,8 +2,6 @@ package anyi.space.memberConsumer;
 
 import org.springframework.boot.SpringApplication;
 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;
 
 /**
@@ -13,11 +11,10 @@ import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  * @Data:2025/4/13 20:05
  * @Description:
  */
-@EnableDiscoveryClient
 @EnableEurekaClient
-@SpringBootApplication(exclude= DataSourceAutoConfiguration.class)
-public class MemberConsumerApplication {
+@SpringBootApplication()
+public class MemberGatewayApplication {
     public static void main(String[] args) {
-        SpringApplication.run(MemberConsumerApplication.class,args);
+        SpringApplication.run(MemberGatewayApplication.class,args);
     }
 }

+ 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();
-    }
-}

+ 0 - 70
member-service-consumer/src/main/java/anyi/space/memberConsumer/controller/MemberConsumerController.java

@@ -1,70 +0,0 @@
-package anyi.space.memberConsumer.controller;
-
-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.cloud.client.ServiceInstance;
-import org.springframework.cloud.client.discovery.DiscoveryClient;
-import org.springframework.util.DigestUtils;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-
-/**
- * @ProjectName: distributedSystemLearn
- * @FileName: MemberConsumerController
- * @Author: 杨逸
- * @Data:2025/4/13 20:07
- * @Description:
- */
-@Slf4j
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/member")
-public class MemberConsumerController {
-    private final MemberService memberService;
-    private final DiscoveryClient discoveryClient;
-    private final ObjectMapper objectMapper;
-    @GetMapping
-    public ResponseResult<Member> getMemberById(Long id){
-        Member member = memberService.getById(id);
-        return ResponseResult.okResult(member);
-    }
-    @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);
-    }
-    @GetMapping("/discovery")
-    public ResponseResult discovery(){
-        //获取所有注册的服务名称
-        List<String> services = discoveryClient.getServices();
-        for (int i = 0; i < services.size(); i++) {
-            String service = services.get(i);
-            log.info("服务名称:{}",service);
-            //获取对应服务的实例信息列表
-            List<ServiceInstance> instances = discoveryClient.getInstances(service);
-            for (int j = 0; j < instances.size(); j++) {
-                //获取具体服务实例的信息,比如IP和端口等
-                ServiceInstance instance = instances.get(j);
-                try {
-                    log.info("服务名称:{},服务实例信息:{}",service,objectMapper.writeValueAsString(instance));
-                } catch (JsonProcessingException e) {
-                    e.printStackTrace();
-                    log.error("服务名称:{},服务实例信息:{}",service,e.getMessage());
-                }
-            }
-        }
-        return ResponseResult.okResult(services);
-    }
-}

+ 0 - 16
member-service-consumer/src/main/java/anyi/space/memberConsumer/service/MemberService.java

@@ -1,16 +0,0 @@
-package anyi.space.memberConsumer.service;
-
-import anyi.sapce.common.entity.Member;
-
-/**
- * @ProjectName: distributedSystemLearn
- * @FileName: MemberService
- * @Author: 杨逸
- * @Data:2025/4/13 20:10
- * @Description:
- */
-public interface MemberService {
-    Member getById(Long id);
-
-    boolean save(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;
-    }
-}

+ 28 - 3
member-service-consumer/src/main/resources/application.yaml

@@ -1,14 +1,39 @@
 server:
   port: 80
   servlet:
-    context-path: /member-consumer
+    context-path: /member-gateway
 spring:
   application:
-    name: member-consumer
+    name: member-gateway
+  cloud:
+    gateway:
+      #配置路由,可以配置多组
+      routes:
+        #配置路由的id,需要全局唯一,查询数据使用该路由
+        - id: member10001
+          #路由转发的URI,最终转发的URL = URI + PATH
+          uri: http://localhost:10001
+          #配置路由的断言,满足条件时才进行路由
+          predicates:
+            #路径断言
+            - Path=/member-gateway/member
+            #方法断言
+            - Method=GET
+          filters:
+            #重写路径,将请求路径中的member-gateway替换为member-provider,使用到正则表达式的命名捕获分组,语法格式:(?<捕获分组名称>pattern),引用捕获分组:$\{捕获分组名称}
+            - RewritePath=/member-gateway/(?<segment>.*), /member-provider/$\{segment}
+        #第二组路由,新增数据使用该路由
+        - id: member10002
+          uri: http://localhost:10002
+          predicates:
+            - Path=/member-gateway/member
+            - Method=POST
+          filters:
+            - RewritePath=/member-gateway/(?<segment>.*), /member-provider/$\{segment}
 eureka:
   instance:
     #配置注册到Eureka Server中的名称
-    appname: member-consumer
+    appname: member-gateway
   client:
     #是否将自己注册到Eureka Server中
     register-with-eureka: true