1.接续SpringCloud(一)中的实例。如果我们的user-server部署了多个实例,如图:


解答的问题也就是Eureka的功能
问题1:order-service如何的值user-service实例地址?
获取地址信息的流程如下:
问题2:order-service如何从众多user-service中选择具体的实例?
问题3:order-service如何得知某个user-service实例是否依然健康,是否已经宕机?
首先大家注册中心服务端:eureka-server,这必须是一个独立的微服务。所以我们在父工程下单独创建一个服务用来创建eureka-server
引入SpringCloud为eureka提供的started依赖:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
必须添加一个**@EnableEurekaSvrver**注解,开启eureka的注册中心
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
编写application.yml文件,内容如下:
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
启动微服务,然后在浏览器访问:http://127.0.0.1:10086
看到下面结果应该是成功了:

<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
在user-service中,修改application.yml文件,添加服务名称,eureka地址:
spring:
application:
name: userservice #服务名称会在eureka的注册中心显示
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
步骤一:先复制原来的user-service启动配置
步骤二:在弹出的窗口中填写信息:
步骤三:在SpringBoot的servcie运行窗口中会出现两个user-service启动配置。但是,是两个端口号。启动后分别是8081和8082

步骤四:查看Eureka的管理页面

修改order-service的逻辑:想erueka-server拉取其中的user-service服务,实现服务的发现
服务的发现、服务的注册统一都封装在eureka-client依赖,所以引入的依赖和user-service一样
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
服务发现也需要知道eureka地址,所以也是需要配置eureka的信息的,在order-serivce中修改application.yml文件,添加服务名称、eureka地址:
spring:
application:
name: orderservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
步骤一:我们需要去eureka-server中拉取user-service服务的实例列表,并且实现负载均衡。添加注解即可
@LoadBalance:开启负载均衡策略
@MapperScan("cn.chen.order.mapper")
@SpringBootApplication
@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 创建RestTemplate并注入Spring容器
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
步骤二:修改order-service服务中的cn.chen.order.service包下的OrderService类中的queryOrderById方法。修改访问的url路径,用服务名代替ip、端口:
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.利用RestTemplate发起http请求,查询用户
// 2.1.url路径,写提供者的服务名称,该名称是在eureka中注册过的,不区分大小写
// 会经过ribbon,ribbon中有拦截器,会拦截客户端的http请求,然后ribbon会拿到userservice服务名到eureka中取真正的服务端口
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;
}