目录结构
springcloud-parents
父工程(pom)
----springcloud-eureka-server
Eureka Service
----springcloud-parent
父模块(pom)
--------springcloud-api-service
接口 (pom)
------------springcloud-api-member-service
接口 (jar)
------------springcloud-api-order-service
接口 (jar)
--------springcloud-api-member-service-impl
会员接口实现 (pom)
--------springcloud-api-order-service-impl
订单接口实现(pom)
模块代码
springcloud-parents父工程
构建 spring initializr
工程习惯把开发工具和web加进来了哈:
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<modules> <module>springcloud-eureka-server</module>
<module>springcloud-parent</module>
</modules> <parent> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.baba.wlb</groupId>
<artifactId>springcloud-parents</artifactId>
<version>1.0-SNAPSHOT</version>
<name>springcloud-parents</name>
<description>Demo project for Spring Boot</description>
<properties> <java.version>1.8</java.version>
</properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency> <dependency> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency> <dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude> </excludes> </configuration> </plugin> </plugins> </build>
</project>
springcloud-parent
pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent> <artifactId>springcloud-parents</artifactId>
<groupId>com.baba.wlb</groupId>
<version>1.0-SNAPSHOT</version>
</parent> <modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-parent</artifactId>
<packaging>pom</packaging>
<modules> <module>springcloud-api-service</module>
<module>springcloud-api-order-service-impl</module>
<module>springcloud-api-member-service-impl</module>
</modules>
<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 客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--springcloud 整合openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</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>
springcloud-api-service
pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent> <artifactId>springcloud-parent</artifactId>
<groupId>com.baba.wlb</groupId>
<version>1.0-SNAPSHOT</version>
</parent> <modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-api-service</artifactId>
<packaging>pom</packaging>
<modules> <module>springcloud-api-member-service</module>
<module>springcloud-api-order-service</module>
</modules>
</project>
springcloud-api-member-service
- pom依赖:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent> <artifactId>springcloud-api-service</artifactId>
<groupId>com.baba.wlb</groupId>
<version>1.0-SNAPSHOT</version>
</parent> <modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-api-member-service</artifactId>
<packaging>jar</packaging>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration> <skip>true</skip>
</configuration> </plugin> </plugins> </build>
</project>
- IMemberService 接口
package com.baba.api.service;
import com.baba.api.entity.UserEntity;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @Author wulongbo
* @Date 2021/1/22 11:34
* @Version 1.0
*/public interface IMemberService {
// 实体类和定义的接口信息存放在接口项目
// 代码实现存放在接口实现类里面
@RequestMapping("/getMember")
UserEntity getMember(String name);
}
- 实体类 UserEntity:
package com.baba.api.entity;
import lombok.Data;
/**
* @Author wulongbo
* @Date 2021/1/22 11:41
* @Version 1.0
*/@Data
public class UserEntity {
private String name;
private String password;
}
springcloud-api-order-service
- pom依赖:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent> <artifactId>springcloud-api-service</artifactId>
<groupId>com.baba.wlb</groupId>
<version>1.0-SNAPSHOT</version>
</parent> <modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-api-order-service</artifactId>
<packaging>jar</packaging>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration> <skip>true</skip>
</configuration> </plugin> </plugins> </build></project>
- IOrderService 接口
package com.baba.api.service;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @Author wulongbo
* @Date 2021/1/22 13:46
* @Version 1.0
*/public interface IOrderService {
// 订单服务调用会员服务接口 feign @RequestMapping("/getOrderByMember")
String getOrderByMember(String name);
}
springcloud-api-member-service-impl
- pom依赖:依赖 springcloud-api-member-service 模块
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent> <artifactId>springcloud-parent</artifactId>
<groupId>com.baba.wlb</groupId>
<version>1.0-SNAPSHOT</version>
</parent> <modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-api-member-service-impl</artifactId>
<dependencies> <dependency> <groupId>com.baba.wlb</groupId>
<artifactId>springcloud-api-member-service</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency> </dependencies>
</project>
- MemberServiceImpl 现类:实现 IMemberService
package com.baba.api.service.impl;
import com.baba.api.entity.UserEntity;
import com.baba.api.service.IMemberService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author wulongbo
* @Date 2021/1/22 11:43
* @Version 1.0
*/
@RestController
public class MemberServiceImpl implements IMemberService {
@Override
@RequestMapping("/getMember")
public UserEntity getMember(String name) {
UserEntity userEntity=new UserEntity();
userEntity.setName(name);
userEntity.setPassword("123456");
return userEntity;
}
}
- application.yml 配置文件:做了Eureka 集群
##服务端口号
server:
port: 8000
spring:
application:
##服务别名--服务注册到Eureka名称
name: app-member
eureka:
client:
service-url:
##当前服务注册到Eureka服务地址
defaultZone: http://localhost:8100/eureka,http://localhost:9100/eureka
register-with-eureka: true
## 需要检索服务信息
fetch-registry: true
- AppMember 启动类:启用EurekaClient 和 FeignClients
package com.baba.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;
/**
* @Author wulongbo
* @Date 2021/1/9 15:22
* @Version 1.0
*/@EnableEurekaClient
@EnableFeignClients
@SpringBootApplication
public class AppMember {
public static void main(String[] args) {
SpringApplication.run(AppMember.class,args);
}
}
springcloud-api-order-service-impl
- pom依赖:依赖 springcloud-api-order-service 模块 和 springcloud-api-member-service模块
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent> <artifactId>springcloud-parent</artifactId>
<groupId>com.baba.wlb</groupId>
<version>1.0-SNAPSHOT</version>
</parent> <modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-api-order-service-impl</artifactId>
<dependencies> <dependency> <groupId>com.baba.wlb</groupId>
<artifactId>springcloud-api-order-service</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!--引入会员接口项目-->
<dependency>
<groupId>com.baba.wlb</groupId>
<artifactId>springcloud-api-member-service</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency> </dependencies>
</project>
- application.yml 配置文件:做了Eureka 集群
##服务端口号
server:
port: 8200
spring:
application:
##服务别名--服务注册到Eureka名称
name: app-order
eureka:
client:
service-url:
##当前服务注册到Eureka服务地址
defaultZone: http://localhost:8100/eureka,http://localhost:9100/eureka
register-with-eureka: true
## 需要检索服务信息
fetch-registry: true
##心跳检测与续约时间
##测试的时候将值设置小一些,保证服务关闭后注册中心能及时剔除服务
instance:
##Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端会告诉服务端会按照该规则)
lease-renewal-interval-in-seconds: 1
##Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端会告诉服务端会按照该规则)
lease-expiration-duration-in-seconds: 2
- Feign Service调用:继承 IMemberService,注入provide别名
package com.baba.api.feign;
import com.baba.api.service.IMemberService;
import org.springframework.cloud.openfeign.FeignClient;
/**
* @Author wulongbo
* @Date 2021/1/22 14:12
* @Version 1.0
*/@FeignClient(name = "app-member")
public interface MemberServiceFeign extends IMemberService{
}
- OrderServiceImpl实现类:IOrderService的实现,注入Feign
package com.baba.api.service.impl;
import com.baba.api.entity.UserEntity;
import com.baba.api.feign.MemberServiceFeign;
import com.baba.api.service.IOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author wulongbo
* @Date 2021/1/22 13:51
* @Version 1.0
*/
@RestController
public class OrderServiceImpl implements IOrderService {
//订单服务集成会员服务接口,用来实现feign 客户端 减少接口重复代码
@Autowired
private MemberServiceFeign memberServiceFeign;
@Override
@RequestMapping("/getOrderByMember")
public String getOrderByMember(String name) {
UserEntity userEntity = memberServiceFeign.getMember(name);
return userEntity == null ? "没有找到用户信息!" : userEntity.toString();
}
}
- AppOrder启动类:启用EurekaClient 和 FeignClients
package com.baba.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;
/**
* @Author wulongbo
* @Date 2021/1/9 15:39
* @Version 1.0
*/@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class AppOrder {
public static void main(String[] args) {
SpringApplication.run(AppOrder.class,args);
}
}
springcloud-eureka-server
Eureka Server服务
- pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent> <artifactId>springcloud-parents</artifactId>
<groupId>com.baba.wlb</groupId>
<version>1.0-SNAPSHOT</version>
</parent> <modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-eureka-server</artifactId>
<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>
- application.yml 务配置文件:
##服务端口号
server:
port: 8100
spring:
application:
##Eureka集群使用,名称必须一致
name: baba-eureka
eureka:
instance:
##服务注册中心ip地址
hostname: 127.0.0.1
client:
serviceUrl:
##注册地址
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://${eureka.instance.hostname}:9100/eureka/
##因为自己是注册中心,是否需要自己将自己注册到注册中心(集群的时候为true)
register-with-eureka: true
##因为自己是注册中心,不需要去检索服务信息
fetch-registry: true
server:
##测试时关闭自我保护机制,保证不可用服务及时剔除
enable-self-preservation: false
eviction-interval-timer-in-ms: 2000
注:另外一台集群配置省略
- Eureka 服务启动类:
package wlb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
//@EnableEurekaServer 表示开启Eureka服务 开启注册中心
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
测试
启动 Eureka Server(集群)服务,启动Member和order服务。
分别访问Eureka集群服务:http://localhost:8100/,http://localhost:9100/
可以看到provide服务注册到了默认Eureka上。
调用会员模块:http://localhost:8000/getMember?name=99
调用订单模块,查看能否feign调用到会员模块:http://localhost:8200/getOrderByMember?name=iswulongbo
成功调用!但是 name 没有成功入参:
解决方案:入参强制要求,需要在 IMemberService接口 以及 MemberServiceImpl实现类中都加入 @RequestParam("name")注解:
再次访问:http://localhost:8200/getOrderByMember?name=iswulongbo
入参成功!
至此实现了和调用 http://localhost:8000/getMember?name=iswulongbo一样的效果:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。