zoukankan      html  css  js  c++  java
  • 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默认开启的本地负载均衡~

  • 相关阅读:
    how to uninstall devkit
    asp.net中bin目录下的 dll.refresh文件
    查找2个分支的共同父节点
    Three ways to do WCF instance management
    WCF Concurrency (Single, Multiple, and Reentrant) and Throttling
    检查string是否为double
    How to hide TabPage from TabControl
    获取当前系统中的时区
    git svn cygwin_exception
    lodoop打印控制具体解释
  • 原文地址:https://www.cnblogs.com/toov5/p/9955832.html
Copyright © 2011-2022 走看看