赞
踩
1、微服务需要根据业务模块拆分,做到单一职责,不要重复开发相同业务
2、微服务可以将业务暴露为接口,供其它微服务使用
3、不同微服务都应该有自己独立的数据库
每一个模块只做自己分内的事情,每一个数据库也只存自己份内拥有的数据。
需求分析 :
现在有两个服务分别是订单服务和用户信息服务,由于每个服务只能提供单一的功能,所以我们想查询一个订单,并且在该订单的查询结果中显示订单的详情之外也显示订单所属用户的基本信息,显然根据微服务设计原则,订单模块只能查出订单的信息,无法查询出用户的信息,所以 下文都是围绕该问题进行书写。
下面采用最简单直接的方式实现上述的功能
1、将RestTemplate对象注入到Spring容器。(通常在配置类或启动类注入)
- //在Spring Boot启动类注入
- @SpringBootApplication
- public class OrderApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(OrderApplication.class, args);
- }
-
- //注入RestTemplate 对象
- @Bean
- public RestTemplate restTemplate(){
- return new RestTemplate();
- }
- }
2、使用端调用get/postForObject来向不同的服务发送请求:
- @Service
- public class OrderService {
-
- @Autowired//注入对象
- private RestTemplate restTemplate;
-
- public Order queryOrderById(Long orderId) {
- // 1.查询订单
- Order order = orderMapper.findById(orderId);
- // TODO 2.查询用户
- String url = "http://localhost:8081/user/" + order.getUserId();
- //当传入类名时会自动返回对应的数据类型
- User user = restTemplate.getForObject(url, User.class);
- // 3.封装user信息
- order.setUser(user);
- // 4.返回
- return order;
- }
- }

通过上面的操作我们会发现一些问题:
1、地址发生了硬编码。
2、如果为了负载均衡提供了多个端口,有些挂掉了,我们就会访问挂掉的服务造成堵塞
于是Eureka为我们做了如下的操作:
1、消费者该如何获取服务提供者具体信息?
2、如果有多个服务提供者,消费者该如何选择?
3、消费者如何感知服务提供者健康状态?
1、创建Maven项目引入server服务端依赖:
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
- </dependency>
2、编写启动类,添加@EnableEurekaServer注解:
- @SpringBootApplication
- //就加一个eureka的注解即可
- @EnableEurekaServer
- public class OrderApplication {
- public static void main(String[] args) {
- SpringApplication.run(OrderApplication.class, args);
- }
- }
3、添加application.yml文件,编写配置信息:
- server:
- port: 10086 # eureka的端口
- spring:
- application:
- name: eurekaserver # eureka这个服务的名称
- eureka:
- client:
- service-url: #eureka的地址信息
- defaultZone: http://127.0.0.1:10086/eureka/
1、来到客户端,添加client客户端依赖:
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
2、来到客户端的yml文件,将其注册进去:
-
- spring:
- application:
- name: userservice # 微服务的名称,这个名称后期互相调用时候会用
- eureka:
- client:
- service-url: # eureka的地址信息
- defaultZone: http://127.0.0.1:10086/eureka/
在前几个步骤我们已经实现了 注册Eireka服务器->注册服务 此时我们就开始关注如何实现服务之间的访问。
1、将之前的url修改为服务的地址:
- @Autowired
- private RestTemplate restTemplate;
-
- public Order queryOrderById(Long orderId) {
- // 1.查询订单
- Order order = orderMapper.findById(orderId);
- // 2.利用RestTemplate发起http请求,查询用户
- // 2.1.url路径
- String url = "http://userservice/user/" + order.getUserId();
- // 2.2.发送http请求,实现远程调用
- User user = restTemplate.getForObject(url, User.class);
- // 3.封装user到Order
- order.setUser(user);
- // 4.返回
- return order;
- }

2、为了保证复杂均衡,在RestTemplate上添加复杂均衡@LoadBalanced注解:
- @Bean
- @LoadBalanced
- public RestTemplate restTemplate() {
- return new RestTemplate();
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。