SpringCloud微服务架构03-注册服务消费者并使用rpc远程调用服务提供者(简单实现负载均衡)

上一篇文章中介绍了注册服务提供者(即被调用的服务)以及相关的原理,这篇文章来介绍服务消费者并实现rpc远程调用服务提供者。

(c)注册服务消费者

新建一个订单服务,取名为order-service。在pom.xml添加相关依赖:


	org.springframework.boot
	spring-boot-starter-parent
	2.0.1.RELEASE



	
		
			org.springframework.cloud
			spring-cloud-dependencies
			Finchley.M7
			pom
			import
		
	


	
	
		org.springframework.boot
		spring-boot-starter-web
	
	
	
		org.springframework.cloud
		spring-cloud-starter-netflix-eureka-client
	




	
		spring-milestones
		Spring Milestones
		https://repo.spring.io/libs-milestone
		
			false
		
	

在recourse文件夹下新建配置文件application.yml:

###服务启动端口号
server:
  port: 8001
###服务名称(服务注册到eureka名称)  
spring:
	application:
    	name: order
###服务注册到eureka地址
eureka:
client:
	service-url:
       defaultZone: http://localhost:8100/eureka

###将该服务注册到注册中心上
register-with-eureka: true
###是否需要从eureka上获取注册信息
fetch-registry: true

编写controller用来处理请求:

@RestController
public class OrderController{
	@Autowired
	private RestTemplate restTemplate;		//使用rest方式调用

	@RequestMapping("/getorder")
	public String getOrder() {
		// order 使用rpc 远程调用技术调用会员服务
		String memberUrl = "http://member/getMember";		//member是服务提供者的别名,此处也可以写具体的服务ip地址和端口号。如果是以别名的形式调用,一定要使用@LoadBalanced注解实现负载均衡!
		String result = restTemplate.getForObject(memberUrl, String.class);
		System.out.println("订单服务调用会员服务,result:" + result);
		return result;
	}

}

在上面的代码中我们使用的是rpc远程调用技术中的rest调用方式来实现一个服务调用另外一个服务,在此场景中即服务提供者member-service中的MemberController中的getMember()接口所return的Json数据将被保存到这里的result中。

使用rest方式需要RestTemplate对象,而在这里如果直接编写启动类启动项目会报错,报错信息为“找不到RestTemplate这个实例”,这是因为没有将RestTemplate对象注册到spring容器中!!!所以我们需要使用@Bean注解将该实例注册到spring容器中,这样spring框架才能给你自动装配这个实例。

rest方式调用,写url的时候有两种写法。第一种是直接写服务提供者的接口地址,另外一种是写别名(服务提供者的application.xml中配置的别名)。而若使用别名的形式进行调用,需要依赖于ribbon(负载均衡器)中的一些相关依赖!一定要使用@LoadBalanced注解来实现负载均衡!否则项目启动也会报错!

所以我们的启动类为:

@SpringBootApplication
@EnableEurekaClient
public class AppOrder {

	public static void main(String[] args) {
		SpringApplication.run(AppOrder.class, args);
	}

	@Bean
	@LoadBalanced			//开启负载均衡功能
	RestTemplate restTemplate() {
		return new RestTemplate();
	}

}

这样就ok了,老样子,先跑注册中心,再跑另外两个服务。在注册中心的首页中可以看到有两个应用注册上去了。然后我们访问订单服务localhost:8001/getorder就能看到会员服务中接口返回的json数据了!这就说明咱们的订单服务调用会员服务成功了!

如果我们把member-service服务copy一份,在application.yml中设置一个新的端口号,再启动服务,此时因为订单服务order-service中根据别名调用会员服务时实现了负载均衡,会轮循调用两个别名一样的会员服务!可见@LoadBalanced注解可以用轮循调用的方式实现负载均衡!

你可能感兴趣的:(负载均衡,rest远程调用,服务消费者,springcloud微服务,ribbon)