一、搭建工具介绍:
idea
springboot 2.x 版本
jdk1.8.x 版本
上一篇博客简单的介绍了springcloud微服务注册中心的搭建,有了注册中心之后,我们需要把服务提供者以及服务的消费者都需要注册到我们注册中心所在的地址,在这里简单介绍一下两个概念:
服务提供者:服务的提供者指的是某一个程序发布一个向外可以被外界访问的服务接口,就好比去商店买东西,商店就属于服务的提供者
服务的消费者:一般我们所说的消费者是某个客户端比如前段、app、h5,还是上边边的例子去商店买东西,去商店的人就相当于服务的消费者。
服务的提供者与消费者:服务的提供者一定是提供服务,而消费者一定就是消费吗? 这个答案是不一定的,在写程序的时候,某一个模块需要向其他模块提供某个接口,这时是提供者,而这个模块也可以调用别的的接口这时相对来说是消费者,所以服务提供者不一定就是提供者,消费者不一定是消费者。
简单了解概念之后我们创建两个项目。number项目与order项目在这里我们把number项目当做服务的提供者,order项目当做服务的消费方
number项目:
pom.xml文件的内容注册中心是eureka-server,这里的是eureka-client客户端
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.number</groupId>
<artifactId>springcloud-number</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-number</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<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>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml这里介绍一下service-url:这个指的是注册中心的地址在上一章中我们搭建的注册中心地址就是这个
server:
port: 8200
spring:
application:
name: springcolud-number
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
fetch-registry: true
register-with-eureka: true
服务提供的接口:一个简单的接口访问这个接口时返回服务提供者的端口号
@RestController
public class numberController {
@Value("${server.port}")
private String serverprot;
@RequestMapping("conNumApi")
public String getNumber(){
return "this is number Server"+serverprot;
}
}
启动类:@EnableEurekaClient 这里注解需要注意一下这个是启动客户端注解,注册中心是@EnableEurekaServer
@SpringBootApplication
@EnableEurekaClient
public class SpringcloudNumberApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudNumberApplication.class, args);
}
}
到此简单的服务提供者已经完成了,下面我们创建服务的消费者:
order项目
pxm文件
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com</groupId>
<artifactId>springcloud-order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-order</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<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>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
基本跟number项目一样
application.xml 这里端口使用8300防止端口的冲突
server:
port: 8300
spring:
application:
name: springcloud-order
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8100/eureka
fetch-registry: true
register-with-eureka: true
java代码 这里简单的了解一下,在springcloud中调用服务接口有两种方式一种是 restTemplate 另一种是feign客户端这里我使用第一种restTemplate方式
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("order")
public String getOrder() {
// //采用直接调用,不会走注册中心
// String rest = restTemplate.getForObject("http://192.168.100.56:8200/conNumApi", String.class);
// System.out.println("订单服务调用会员服务result=" + rest);
//以别名方式进行请求,走注册中心
String url="http://springcolud-number/conNumApi";
String rest = restTemplate.getForObject(url, String.class);
System.out.println("订单服务调用会员服务result=" + rest);
return rest;
}
}
启动类
@SpringBootApplication
@EnableEurekaClient
public class SpringcloudOrderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudOrderApplication.class, args);
}
//解决'org.springframework.web.client.RestTemplate' that could not be found.模板找不到问题
// 解决java.net.UnknownHostException: springcolud-number 无法解析别名需要加@LoadBalanced注解
@Bean
@LoadBalanced
// @LoadBalanced实现RestTemplate客户端负载均衡
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
这里提到两个异常,首先说第一个异常,这个异常引起的原因是把下面getRestTemplate实例去掉会出现org.springframework.web.client.RestTemplate' that could not be found.模板找不到问题这个是需要在spring中注册一下RestTemplate类的实例
第二个异常是@LoadBalanced把这个注解去掉,这个去掉之后会出现java.net.UnknownHostException: springcolud-number 无法解析别名需要加@LoadBalanced注解这个是实现客户端的负载均衡,springcloud是在客户端实现的负载均衡跟nginx不一样nginx是实现的服务端的负载均衡,比如tomcat服务器之类的启动容器
到此为止我们首先启动上一章的注册中心然后启动number服务,再启动order服务 在地址栏输入localhost:8100 进入注册中心发现有两个服务,一个是number,一个是order,然后再开一个浏览器标签页访问 http://localhost:8300/order 这时会发现页面返回信息服务提供者端口号, 服务提供者与消费者就实现了。
如果会使用maven聚合可以把三个写到一起可以方便一些不用来回的切换。以后会有集群的注册中心以及高可用注册中心,简单说一下集群以及高可用注册中心的实现,就是创建两个注册中心,相互调用实现你中有我,我中有你服务提供者跟消费者注册到注册中心的地址,以逗号分隔写多个地址,这就是集群+高可用注册中心,这个可以解决就是当其中一个注册中心出现意外情况坏掉之后会同步到备用的注册中心。