• Spring Cloud之Feigin客户端重构思想


    应该重构接口信息(重点) 

    toov5-parent  存放共同依赖信息

     toov5-api       api的只有接口没有实现

      toov5-api-member   

      toov5-api-order

    too5-member-impl   api接口的实现

    toov5-order-impl

    1、 创建 parent的 pom工程

    2、 点击parent创建maven model   的 service   pom    

    3、 点击 service 创建两个 api-service 的jar

    4、点击parent创建 两个 两个接口的实现 jar

    实体类 是单独建立一个项目 实体类存放在接口下面 接口可能会被别人调用 其他核心代码就别写到这里了 实体类还是可以的
    代码是吸纳存放在接口实现类里面

    依赖jar 放在parent

    定义member 接口 和涉及到的 实体类

    这里面的核心 订单服务调用会员服务接口,用来实现feign客户端 ,减少重复代码

    Eureka server:

     pom:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.toov5</groupId>
      <artifactId>SpringCloud-eureka-server</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.0.1.RELEASE</version>
    	</parent>
    	<!-- 管理依赖 -->
    	<dependencyManagement>
    		<dependencies>
    			<dependency>
    				<groupId>org.springframework.cloud</groupId>
    				<artifactId>spring-cloud-dependencies</artifactId>
    				<version>Finchley.M7</version>
    				<type>pom</type>
    				<scope>import</scope>
    			</dependency>
    		</dependencies>
    	</dependencyManagement>
    	<dependencies>
    		<!--SpringCloud eureka-server -->
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    		</dependency>
    	</dependencies> 
    	<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
    	<repositories>
    		<repository>
    			<id>spring-milestones</id>
    			<name>Spring Milestones</name>
    			<url>https://repo.spring.io/libs-milestone</url>
    			<snapshots>
    				<enabled>false</enabled>
    			</snapshots>
    		</repository>
    	</repositories>
      
    </project>
    

      yml:

    ###eureka 服务端口号
    server:
      port: 8100
    ###服务注册名称
    eureka:
      instance:
      ##注册中心ip地址
        hostname: 127.0.0.1
    ###客户端调用地址
      client:
        serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    ###因为该应用为注册中心,不会注册自己 (集群设为true)
        register-with-eureka: false
    ###因为自己为注册中心 ,不会去在该应用中的检测服务 
        fetch-registry: false

    启动类:

    package com.toov5;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    
    @EnableEurekaServer   //开启注册中心
    @SpringBootApplication 
    public class AppEureka {
      
         public static void main(String[] args) {
               SpringApplication.run(AppEureka.class, args);
        }
        
    }

    业务逻辑部分:

    其中service 是个pom文件 包括两个model : member service  和 order service 两个接口

    实现类分别是   member service  impl 和  order service

    service 接口项目聚合:

    Member:

    entity:

    package com.toov5.api.entity;
    
    import lombok.Data;
    
    @Data
    public class UserEntity {
        private String name;
        private Integer age;
       
    }

    service接口:

    package com.toov5.api.service;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.toov5.api.entity.UserEntity;
    
    @RestController
    public interface IMemberService {
     
        @RequestMapping("/getMember")  //接口加@RequestMapping 被其他项目调用时候 feign客户端可以继承
        public UserEntity getMember(@RequestParam("name") String name);
        
    }

    实现:

     pom:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <parent>
        <groupId>com.toov5</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
      </parent>
      <artifactId>toov5-api-member-service-impl</artifactId>
      
      	<dependencies> 
      	 	<dependency>
      	 	  <groupId>com.toov5</groupId>
               <artifactId>toov5-api-member-service</artifactId>
                 <version>0.0.1-SNAPSHOT</version>
      	 	</dependency>	
      	 	<dependency>
      	 	  <groupId>com.toov5</groupId>
                <artifactId>toov5-api-order-service</artifactId>
                 <version>0.0.1-SNAPSHOT</version>
      	 	</dependency>	 	
      	</dependencies>
      
    </project>
    

      实现:

    package com.toov5.api.service.impl;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import com.toov5.api.entity.UserEntity;
    import com.toov5.api.service.IMemberService;
    
       //注意加在实现类上面!!! 接口不能加 接口不能被实例化
    @RestController
    public class MemberServiceImpl implements IMemberService { @RequestMapping("/getMember") public UserEntity getMember(@RequestParam("name") String name) { UserEntity userEntity = new UserEntity(); userEntity.setName(name); userEntity.setAge(10); return userEntity; } }

    启动类:

    package com.toov5.api.service.impl;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication
    @EnableEurekaClient
    @EnableFeignClients
    public class AppMember {
      public static void main(String[] args) {
        SpringApplication.run(AppMember.class, args);
    }
    }

    Order:

    接口类:

    package com.toov5.api.service;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    
    public interface IOrderService {
       //订单服务带哦用会员服务接口信息fegin
        @RequestMapping("/orderToMember")
        public String orderToMember(String name);
    }

    实现:

     Feign: 通过继承 减少代码

    package com.toov5.api.feign;
    
    import org.springframework.cloud.openfeign.FeignClient;
    
    import com.toov5.api.service.IMemberService;
    //避免了冗余代码 直接过来就ok了
    @FeignClient("app-toov5-member")
    public interface MemberServiceFeign extends IMemberService {
       //实体类是存放接口项目还是存放在实现项目 实体类存放在接口项目里面
        //实体类和定义接口信息存放在接口项目
        //代码实现放在接口实现类里面
    }
    package com.toov5.api.service.impl;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.toov5.api.entity.UserEntity;
    import com.toov5.api.feign.MemberServiceFeign;
    import com.toov5.api.service.IOrderService;
    
    @RestController
    public class OrderServiceImpl implements IOrderService {
            @Autowired
          private MemberServiceFeign memberServiceFeign; 
        
          @RequestMapping("orderToMmeber")
          public String orderToMember(String name) {
          UserEntity user = memberServiceFeign.getMember(name);
            return  user==null ? "没有找到用户先关信息" : user.toString();
        }
    }
     
    package com.toov5.api;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication(scanBasePackages={"com.toov5.*"})
    @EnableEurekaClient
    @EnableFeignClients
    public class AppOrder {
       public static void main(String[] args) {
        SpringApplication.run(AppOrder.class, args);
    }
    }

    yml:

    ###服务启动端口号
    server:
      port: 8001
    ###服务名称(服务注册到eureka名称)  
    spring:
        application:
            name: app-toov5-order
    ###服务注册到eureka地址
    eureka:
      client:
        service-url:
               defaultZone: http://localhost:8100/eureka
    
               
    ###因为该应用为注册中心,不会注册自己
        register-with-eureka: true
    ###是否需要从eureka上获取注册信息
        fetch-registry: true
    

      都启动后:

    访问订单接口

    按照这个规范目录去做 尤其@FeignClient要写到客户端里面 方便做服务降级

    Feign默认开启的本地负载均衡~

  • 相关阅读:
    FZU 2105 (线段树)
    HDU 4903 (模拟+贪心)
    Codeforces Beta Round #91 (Div. 1 Only) E. Lucky Array
    HDU 3308 (线段树区间合并)
    POJ 3667(线段树区间合并)
    线段树题集 (cf版)
    HDU 4902 (牛叉的线段树)
    20150204--JS巩固与加强2-01
    20150203+JS巩固与加强1-02
    20150203+JS巩固与加强1-01
  • 原文地址:https://www.cnblogs.com/toov5/p/9955832.html
Copyright © 2020-2023  润新知