今天我们要搭建正式跨服务调用的实例并集成feign,有设计到下面三个服务:
- eureka-server: 注册中心。
- user: 提供者微服务。
- item: 消费者微服务。
一.base父工程搭建(统一包版本管理)
1.新建hadluo-base pom类型maven工程
2.maven配置
<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.hadluo</groupId>
<artifactId>hadluo-base</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>
feign依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
二.user提供者微服务搭建
1.新建user聚合maven工程,然后在聚合工程下面建一个user-api和user-service子工程。结果 如下:
2.user聚合父工程maven:
<modules>
<module>user-api</module>
<module>user-service</module>
</modules>
<parent>
<groupId>com.hadluo</groupId>
<artifactId>hadluo-base</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
聚合了api,service, parent为我们的base工程。
3.user-service的maven如下:
<dependencies>
<dependency>
<artifactId>user-api</artifactId>
<groupId>com.hadluo</groupId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
就依赖了user-api
4.建立提供者接口,在user-api内建接口:
//声明feign提供出去的接口 user为服务实例名
@FeignClient(value = "user")
public interface UserService {
@RequestMapping(value = "/{uid}", method = RequestMethod.GET)
String get(@PathVariable("uid") Long uid);
}
5.user-service实现:
@RestController
public class UserServiceImpl implements UserService {
@Override
public String get(Long uid) {
System.err.println("user 微服务提供者>>get:" + uid);
return "user服务返回:HadLuo$" + uid;
}
}
6.main入口:
@EnableEurekaClient // 启用EurekaClient与EurekaServer通信,用来获取注册中心维护的实例信息
@SpringBootApplication
@EnableFeignClients(basePackages = { "com.hadluo" }) // 启用feign扫描提供出去的接口
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
7.yml配置:
server:
port: 8881
spring:
application:
#给微服务设置一个名字
name: user
eureka:
client:
#允许作为客户端
fetch-registry: true
service-url:
# eureka 注册中心的地址
defaultZone: http://localhost:8091/eureka/
三.item消费者微服务搭建
1.新建item聚合maven工程,然后在聚合工程下面建一个item-api和item-service子工程。
2.item controller类,用于客户端调用,我们在调用user服务。
@RestController
public class ItemServiceController {
// 直接注入远程的微服务的接口
@Autowired
private UserService userService;
@RequestMapping(value = "/{itemId}/{userId}", method = RequestMethod.GET)
String select(@PathVariable("itemId") Long itemId, @PathVariable("userId") Long userId) {
// 先 调用户微服务,查询用户信息
String ret = userService.get(userId);
System.err.println("user服务返回>>" + ret);
// 查询商品
System.err.println("item服务返回:华为Pro$" + itemId);
return "item服务返回:华为Pro$" + itemId;
}
}
3.main入口:
@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients(basePackages = "com.hadluo")
public class ItemApplication {
public static void main(String[] args) {
SpringApplication.run(ItemApplication.class, args);
}
}
4.yml配置:
server:
port: 8880
spring:
application:
#给微服务设置一个名字
name: item
eureka:
client:
#表示客户端是否从 Eureka Server 获取实例注册信息。
fetch-registry: true
#表示此实例是否注册到 Eureka Server 以供其他实例发现。在某些情况下,如果你不想自己的实例被发现,而只想发现其他实例,配置为 false 即可。
register-with-eureka: true
service-url:
# eureka 注册中心的地址
defaultZone: http://localhost:8091/eureka/
四.eureka-server注册中心就跟我们上节博客一样
springcloud 微服务(一) 生产者 消费者demo
五.测试
分别启动eureka-server,user,item ,在浏览器上访问item的controller:
http://localhost:8880/12/12
到此,我们的远程服务已经调用成功!!!下节博客更精彩!!!