SpringCloud学习笔记
新建项目(前期准备)父项目pom文件user-serviceorder-serviceeureka-server
Eureka注册中心搭建EurekaServer1. 在eureka-server模块中引入spring-cloud-starter-netflix-eureka-server的依赖2. 启动类添加@EnableEurekaServer注解3. 添加application.yml文件,编写以下配置
注册服务在order-service完成服务拉取演示
新建项目(前期准备)
cloud-demo(父项目)
新建三个子模块
user-service:用户服务 order-service:订单服务 eureka-server:注册中心
父项目pom文件
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">
user-service
public interface UserMapper {
@Select("select * from tb_user where id = #{id}")
User findById(@Param("id") Long id);
}
@Data
public class User {
private Long id;
private String username;
private String address;
}
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User queryById(Long id) {
return userMapper.findById(id);
}
}
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 路径: /user/110
* @param id 用户id
* @return 用户
*/
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
}
@MapperScan("com.hzy.user.mapper")
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
order-service
public interface OrderMapper {
@Select("select * from tb_order where id = #{id}")
Order findById(Long id);
}
@Data
public class Order {
private Long id;
private Long price;
private String name;
private Integer num;
private Long userId;
private User user;
}
@Data
public class User {
private Long id;
private String username;
private String address;
}
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.利用RestTemplat发起http请求,查询用户
// 2.1 url路径
String url = "http://localhost:8081/user/"+order.getUserId();
// 2.2 发送http请求
User user = restTemplate.getForObject(url, User.class);
// 3.封装user到order
order.setUser(user);
// 4.返回
return order;
}
}
@MapperScan("com.hzy.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced // 负载均衡注解
public RestTemplate restTemplate(){// 实现服务远程调用
return new RestTemplate();
}
}
eureka-server
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">
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
我们在订单服务里面运程调用用户服务使用的url是:
String url = "http://localhost:8081/user/"+order.getUserId();
这种硬编码在用户服务地址改变后需要重新打包,并且以后用户服务会有多实例,使用硬编码有很强的局限性。
要解决这个问题就要用到注册中心。
注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者 url 串、路由信息等。服务注
册中心是微服务架构中最基础的设施之一。
Eureka注册中心
搭建EurekaServer
1. 在eureka-server模块中引入spring-cloud-starter-netflix-eureka-server的依赖
2. 启动类添加@EnableEurekaServer注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
3. 添加application.yml文件,编写以下配置
server:
port: 10086 # 服务端口
spring:
application:
name: eurekaserver # eureka的服务名称
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
注册服务
将user-service服务注册到eureka-server步骤如下:
在user-service项目引入spring-cloud-starter-netflix-eureka-client依赖
在application.yml文件,编写以下配置
spring:
application:
name: userservice # user的服务名称 不写这个在Eureka注册中心中服务名会是 UNKNOWN
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
在order-service完成服务拉取
下面,我们将order-service的逻辑修改:向eureka-server拉取user-service的信息,实现服务发现。
服务发现、服务注册统一都封装在eureka-client依赖,因此这一步与服务注册时一致。
在order-service的pom文件中,引入下面的eureka-client依赖:
服务发现也需要知道eureka地址,因此第二步与服务注册一致,都是配置eureka信息:
在order-service中,修改application.yml文件,添加服务名称、eureka地址:
spring:
application:
name: orderservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡
修改OrderService的代码,修改访问的url路径,用服务名代替ip、端口:
String url = "http://localhost:8081/user/"+order.getUserId();
----->
String url = "http://userservice/user/"+order.getUserId();
在order-service项目的启动类OrederApplication中的RestTemplate添加负载均衡注解
@Bean
@LoadBalanced // 负载均衡注解
public RestTemplate restTemplate(){
return new RestTemplate();
}
演示
为了演示一个服务有多个实例的场景,我们添加一个SpringBoot的启动配置,再启动一个user-service。 端口号不能相同,修改端口号为8082
启动两个user-service实例:
查看eureka-server管理页面:
测试:成功访问到userservice
参考阅读
发表评论