版权声明:本文为博主原创文章,转载请带上原文链接。 https://blog.csdn.net/weixin_41965979/article/details/86063446
本文详细介绍创建父工程,创建Eureka服务注册中心,创建提供者,消费者和使用Ribbon实现RPC远程调用(后面会讲使用Fegin客户端实现远程调用)。
开发环境:
- idea版本 : 2018.1.4
- jdk : 1.8
- maven:3.5.3(没配好的自己百度配置好)
- SpringBoot:2.0.1RELEASE
- SpringCloud:Finchley.M7
一:创建SpringCloud父项目
springcloud的父工程的作用是用于jar包的管理。
1:打开idea选择创建一个新项目
2:创建maven项目不选择模板直接next
3:指定groupId和artifactid (可自己随意取名),点next
4:指定project的名称位置 ,点Finish
5:父工程可以把src目录删除
6:在pom.xml文件里引入相关的配置依赖
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>cloud_test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>cloud_test</name>
<description>cloud练习项目</description>
<modules>
<module>eureka_server</module>
<module>eureka_member</module>
<module>eureka_order</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<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-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
此时一个父项目新建完成,下面我们开始搭建Eureka服务注册中心。
二:搭建Eureka服务注册中心
1:在我们的父项目上右键new-module
2:选择Spring Initializr,点击next
3: 填写Artifact,点next
4:选择 Cloud Discovery—Eureka Server,SpringBoot版本我这里没改直接在父项目的pom文件里改成了2.0.1RELEASE版本,直接next,Finish创建完成
5:首先给大家看一张详细的结构图,下面我发了每个文件的代码
6:打开创建的eureka_server项目更改pom.xml文件 ,引入相关配置依赖。注意这里的parent里要引入你的父项目,所有的子项目都要把父项目加载进来,这样就不用再引入父项目里引入过的依赖
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>eureka_server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka_server</name>
<parent>
<groupId>com.example</groupId>
<artifactId>cloud_test</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.M7</spring-cloud.version>
</properties>
<!--SpringCloud eureka-server -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</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>
</plugins>
</build>-->
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
7:打开src下面的resources目录,把application.properties改成application.yml(两种配置方式都可以,只不过配置格式不一样,这里我个人喜欢yml配置,也是最方便用的多的配置方式),如果最后大家启动失败把所有注释删掉试试,我这里加上了注释就启动失败,原因还没找到。
server:
port: 8100 ###服务端口号
###eureka 基本信息配置
eureka:
instance:
###注册到eurekaip地址
hostname: localhost
client:
###因为自己是为注册中心,不需要自己注册自己
register-with-eureka: false
###因为自己是为注册中心,不需要检索服务
fetch-registry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
8:在src目录下的java目录里创建一个EurekaServerApplication类(类名自取),代码如下,然后run运行这个类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //作用:开启eurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
9:打开浏览器,输入:http://localhost:8100 (localhost和8100都是你yml里面所配置的,必须一致),界面如下说明Eureka服务注册中心搭建成功了
三:搭建服务提供者(这里以一个会员服务member为例子)
1:在我们的父项目上右键new-module,选择maven,填写ArtifactId,然后next,finish,这些步骤和新建父项目一样
2:引入pom.xml依赖
<?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>cloud_test</artifactId>
<groupId>com.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka_member</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>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot整合eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
3:application.yml
server:
port: 8000
spring:
application:
name: eureka-member
eureka:
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://localhost:8100/eureka
4:MemberController
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MemberController {
@RequestMapping("/getMember")
public String getMember(){
return "this is getMember 我是会员服务 服务提供者!";
}
}
5:AppMember(启动项)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient //将当前服务注册到eureka上
public class AppMember{
public static void main(String[] args) {
SpringApplication.run(AppMember.class,args);
}
}
6:搭建完毕,启动服务提供者eureka_member,刷新注册中心就会有这个服务了(显示的名称是你在yml里配置的name,注意不能用下划线,可以中划线,用下划线后面消费者调用的时候会出问题),同样浏览器上请求你自己配置的端口方法能看到同样的返回说明提供者搭建成功。
四:搭建服务消费者(这里以一个订单服务order为例子)
1:跟搭建提供者一样的步骤搭建一个maven工程,下面我直接提供项目截图和代码
2:pom.xml依赖
<?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>cloud_test</artifactId>
<groupId>com.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka_order</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>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot整合eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
3:application.yml
server:
port: 8001
spring:
application:
name: eureka-order
eureka:
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://localhost:8100/eureka
4:OrderController(这里两种调用方式我都以注解形式写在上面了,如果要用别名方式调用,要加@LoadBalanced负载均衡注解,否则调用报错)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class OrderController {
//RestTemplate 是由SpringBoot web组件提供 默认整合ribbon负载均衡
//rest方式底层是才用HttpClient技术
@Autowired
private RestTemplate restTemplate;
/**
* 在SpringCloud中有两种方式调用:rest,fegin(SpringCloud)
*/
@RequestMapping("/getOrder")
public String getOrder(){
//有两种方式 一种是直接调用 另一种是采用服务别名去注册中心上获取对应的服务调用地址
String result = restTemplate.getForObject("http://127.0.0.1:8000/getMember",String.class);
System.out.println("订单服务调用会员服务result: "+result);
return result;
//服务别名方式调用代码,要在AppOrder引入RestTemplate 时加上一个注解@LoadBalanced
//String memberUrl = "http://eureka-member/getMember";
//String result = restTemplate.getForObject(memberUrl,String.class);
//System.out.println("订单服务调用会员服务result: "+result);
}
}
5:AppOrder(如果报错RestTemplate找不到,通过@Bean把RestTemplate注册到SpringBoot容器中)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableEurekaClient //将当前服务注册到eureka上
public class AppOrder {
public static void main(String[] args) {
SpringApplication.run(AppOrder.class,args);
}
// 解决RestTemplate 找不到原因 应该把RestTemplate注册到SpringBoot容器中 @bean
@Bean
@LoadBalanced //如果使用别名方式调用才加这个注解
RestTemplate restTemplate(){
return new RestTemplate();
}
}
6:消费者搭建成功,启动AppOrder,此时再刷新Eureka注册中心,已经有member、order两个服务了
7:打开浏览器请求消费者order路径 ,此时页面显示的是提供者member的返回内容,说明Rpc远程调用成功了
总结
以上代码全部亲测过,有什么问题留言交流,我也是一个刚入cloud坑的小白,欢迎大佬指出不足之处。
下一篇文章写一个服务里两个服务地址ip之间的轮询调用,刚刚踩坑完还在整理!