一、搭建eureka_server服务
1. 新建项目,依赖添加Cloud Discovery-->Eureka Server
2. 更换阿里云镜像
<repositories>
<repository>
<id>central</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<layout>default</layout>
<!-- 是否开启发布版构件下载 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否开启快照版构件下载 -->
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
3. 启动类增加@EnableEurekaServer注解
4. 增加配置:
erver:
port: 8761
eureka:
instance:
hostname: localhost
client:
#指示此实例是否应将其信息注册到eureka服务器以供其他服务发现,默认为false
register-with-eureka: false
#客户端是否获取eureka服务器注册表上的注册信息,默认为true
fetch-registry: false
service-url:
defaulrZone: http://${eureka.instance.hostname}:${server.port}/eureka/
5. 访问:http://localhost:8761/
二、搭建商品服务
1. 新疆项目,项目依赖web-->spring web,spring cloud discovery-->eureka discovery client
2. 增加配置
server:
port: 8771
eureka:
client:
service-url:
defaulrZone: http://localhost:8761/eureka/
spring:
application:
name: product-service
3. 增加ccontroller,写一个可响应数据的方法
4. 访问:http://127.0.0.1:8771/api/v1/product/list
三、搭建订单服务
1. 新建项目,项目依赖web-->spring web,spring cloud Routing-->Ribbon(一个发请求 的客户端),spring cloud discovery-->eureka discovery client
2. 服务配置:
server:
port: 8781
eureka:
client:
service-url:
defaulrZone: http://localhost:8761/eureka/
spring:
application:
name: order-service
3. 使用Ribbon做负载均衡,由订单服务向商品服务发起请求:
a. 启动类注入RestTemplate的Bean
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
b. 在实现类中实现一个服务对另一个服务的调用:
Object forObject = restTemplate.getForObject("http://product-service/api/v1/product/find?id=" + productId, Object.class);
4. 另外一种Ribbon使用方式
a. 直接在实现类中引入LoadBalancerClient
@Autowired
private LoadBalancerClient loadBalancerClient;
b. 通过这个client调用
ServiceInstance choose = loadBalancerClient.choose("product-service");
String url = String.format("http://%s:%s/api/v1/product/find?id=" + productId, choose.getHost(), choose.getPort());
RestTemplate restTemplate = new RestTemplate();
Map object = restTemplate.getForObject(url, Map.class);
5. 自定义负载均衡策略
需要在调用方服务中配置
product-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
6. 使用Feign做负载均衡(本质还是http调用)
a. 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
b. 启动类新加注解:@EnableFeignClients
c. 新建一个接口
@FeignClient(name = "product-service")
public interface ProductClient {
@GetMapping("/api/v1/product/find")
String findById(@RequestParam(value = "id") int id);
}
如果原服务请求参数注解是@RequestBody,则这个接口请求注解如是,上方的注解也应该改成@PostMapping
d. 在实现类调用,拿到的是Json字符串,可以转成对象
7. Feign调用修改超时时间
feign:
client:
config:
default:
connectTimeout: 2000
readTimeout: 2000
默认readTimeout是60s,但是由于hystrix默认是1s超时