应该重构接口信息(重点)
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默认开启的本地负载均衡~