spring cloud微服务注册服务提供者以及服务的消费者到注册中心

一、搭建工具介绍:

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聚合可以把三个写到一起可以方便一些不用来回的切换。以后会有集群的注册中心以及高可用注册中心,简单说一下集群以及高可用注册中心的实现,就是创建两个注册中心,相互调用实现你中有我,我中有你服务提供者跟消费者注册到注册中心的地址,以逗号分隔写多个地址,这就是集群+高可用注册中心,这个可以解决就是当其中一个注册中心出现意外情况坏掉之后会同步到备用的注册中心。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值