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