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默认开启的本地负载均衡~