Ribbon是一个为客户端提供负载均衡功能的服务,它内部提供了一个叫做ILoadBalance的接口代表负载均衡器的操作,比如有添加服务器操作、选择服务器操作、获取所有的服务器列表、获取可用的服务器列表等等,其主要功能是提供客户端实现负载均衡算法。
客户端
@SpringBootApplication
@EnableEurekaClient
public class SpringcloudConsumer8002Application {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
public static void main(String[] args) {
SpringApplication.run(SpringcloudConsumer8002Application.class, args);
}
}
server:
port: 80
eureka:
client:
registerWithEureka: true
fetchRegistry: true
#registry-fetch-interval-seconds: 5 #在开发环境下,可以修改为 5 秒获取一次。生产环境下一般不用修改
service-url:
defaultZone: http://127.0.0.1:8080/eureka/
instance:
prefer-ip-address: true
ip-address: 127.0.0.1
spring:
application:
name: xxx
注册中心
server:
port: 8080
spring:
application:
name: goodtype-server
eureka:
server:
enable-self-preservation: false # 关闭自我保护模式
eviction-interval-timer-in-ms: 1000 # 扫描失效服务的间隔时间(缺省为 60*1000ms)
instance:
hostname: localhost #eureka服务端的实例名称
instance-id: goodtype-server-8080 #对应status的name
prefer-ip-address: true
client:
register-with-eureka: false # 是否向注册中心注册自己
fetch-registry: false #为 false 表示自己是注册中心
service-url: #注册地址
#单机版本
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#集群
defaultZone: http://com.luo1:7001/eureka/,http://com.luo2:7002/eureka/
服务one
@RestController
public class GoodstypeController {
@Autowired
private GoodstypeI goodstypeI;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/provider/goodstype/get/{id}")
public Goodstype findById(@PathVariable("id") String id){
return goodstypeI.findById(id);
}
@GetMapping("/provider/goodstype/list")
public List queryAll(){
return goodstypeI.queryAll();
}
@GetMapping("/provider/goodstype/add")
public int addGoodstype(Goodstype goodstype){
return goodstypeI.addGoodstype(goodstype);
}
//获取注册进来的微服务的一些信息
@GetMapping("/provider/goodstype/discovery")
public Object discovery(){
//获取微服务列表
List<String> services = discoveryClient.getServices();
System.out.println(services);
//得到具体一个微服务信息
List<ServiceInstance> serviceInstances = discoveryClient.getInstances("GOODSTYPE-PROVIDER");
for (ServiceInstance instance : serviceInstances) {
System.out.println(instance.getInstanceId());//得到实例的id
System.out.println(instance.getHost());//得到主机名
System.out.println(instance.getPort());//得到端口号
System.out.println(instance.getUri());//得到uri
}
return this.discoveryClient;
}
}
server:
port: 8001
mybatis:
mapper-locations: classpath:mapper/*.xml
spring:
application:
name: goodstype-provider
datasource:
username: root
password: root
url: jdbc:mysql://127.0.0.1/xsj?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
eureka:
instance:
ip-address: 127.0.0.1
lease-renewal-interval-in-seconds: 5 # 心跳,服务续约(renew)的间隔,默认为 30 秒
lease-expiration-duration-in-seconds: 10 # 服务失效时间,默认值 90 秒
prefer-ip-address: true # 当调用 getHostname 获取实例的 hostname 时,返回ip 而不是 host 名称
client:
fetch-registry: true # 是否拉取服务注册信息
register-with-eureka: true # 向服务中心注册自己
registry-fetch-interval-seconds: 30 #client间隔多久去拉取服务器注册信息,默认为30秒
service-url: # 注册地址
defaultZone: http://127.0.0.1:8080/eureka/,http://com.luo1:7001/eureka/,http://com.luo2:7002/eureka/
info:
app.name: ljk.cloud
company.name: kk
服务two
@RestController
public class GoodstypeController {
@Autowired
private GoodstypeI goodstypeI;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/provider/goodstype/get/{id}")
public Goodstype findById(@PathVariable("id") String id){
return goodstypeI.findById(id);
}
@GetMapping("/provider/goodstype/list")
public List queryAll(){
return goodstypeI.queryAll();
}
@GetMapping("/provider/goodstype/add")
public int addGoodstype(Goodstype goodstype){
return goodstypeI.addGoodstype(goodstype);
}
//获取注册进来的微服务的一些信息
@GetMapping("/provider/goodstype/discovery")
public Object discovery(){
//获取微服务列表
List<String> services = discoveryClient.getServices();
System.out.println(services);
//得到具体一个微服务信息
List<ServiceInstance> serviceInstances = discoveryClient.getInstances("GOODSTYPE-PROVIDER");
for (ServiceInstance instance : serviceInstances) {
System.out.println(instance.getInstanceId());//得到实例的id
System.out.println(instance.getHost());//得到主机名
System.out.println(instance.getPort());//得到端口号
System.out.println(instance.getUri());//得到uri
}
return this.discoveryClient;
}
}
server:
port: 9001
mybatis:
mapper-locations: classpath:mapper/*.xml
spring:
application:
name: goodstype-provider
datasource:
username: root
password: root
url: jdbc:mysql://127.0.0.1/xsj?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
eureka:
instance:
ip-address: 127.0.0.1
lease-renewal-interval-in-seconds: 5 # 心跳,服务续约(renew)的间隔,默认为 30 秒
lease-expiration-duration-in-seconds: 10 # 服务失效时间,默认值 90 秒
prefer-ip-address: true # 当调用 getHostname 获取实例的 hostname 时,返回ip 而不是 host 名称
client:
fetch-registry: true # 是否拉取服务注册信息
register-with-eureka: true # 向服务中心注册自己
registry-fetch-interval-seconds: 30 #client间隔多久去拉取服务器注册信息,默认为30秒
service-url: # 注册地址
defaultZone: http://127.0.0.1:8080/eureka/,http://com.luo1:7001/eureka/,http://com.luo2:7002/eureka/
info:
app.name: ljk.cloud
company.name: kk
默认是轮询算法,可以自定义负载均衡算法
因为是Ribbon基于客户端的,所以别忘记加入注册中心哦